A julgar pelo diagrama, Product é uma classe de dados idiota, sem funcionalidade para testar. Então, eu começaria a escrever testes para (e implementar, estilo TDD) primeiro Line e depois Order, subindo a escada de dependência. Geralmente, é sensato testar suas classes de nível inferior antes de iniciar o trabalho em classes de nível superior (ou seja, que dependem do nível inferior). Isso torna a captura de bugs mais eficiente.
A necessidade de usar objetos simulados depende das dependências reais da classe testada. Se essas são classes simples que você pode instanciar e configurar facilmente com qualquer dado / estado desejado necessário para seus testes, você não precisa de zombarias. (Esse parece ser o caso do seu exemplo de design aqui.) No entanto, se alguma das dependências for difícil de inicializar / tiver dependências extensas em si / tiver efeitos colaterais indesejáveis / depender de um recurso externo como um banco de dados, faz sentido para usar um objeto simulado.