A juzgar por el diagrama, el producto es una clase de datos tontos, sin funcionalidad para probar. Así que comenzaría a escribir pruebas para (e implementar, estilo TDD) la primera línea y luego ordenar, en la escala de dependencias. Por lo general, es sensato que se analicen las clases de nivel inferior antes de comenzar a trabajar en las clases de nivel superior (es decir, que dependen del nivel inferior). Esto hace que la captura de errores sea más eficiente.
La necesidad de usar objetos simulados depende de las dependencias reales de la clase probada. Si estas son clases simples que puede crear y configurar fácilmente con los datos / estados deseados que se requieren para sus pruebas, no necesita simulacros. (Este parece ser el caso de su diseño de ejemplo aquí). Sin embargo, si alguna de las dependencias es difícil de inicializar / tiene dependencias extensas / tiene efectos secundarios indeseables / depende de un recurso externo como un DB, entonces tiene sentido para usar un objeto simulado en su lugar.