Esta es el arreglo más exacta que te podemos aportar, sin embargo mírala detenidamente y analiza si se adapta a tu proyecto.
Solución:
Debería ser suficiente nombrar sus simulacros serviceA y serviceB. De la documentación de Mockito:
Inyección de setter de propiedad; Los simulacros se resolverán primero por tipo, luego, si hay varias propiedades del mismo tipo, por la coincidencia del nombre de la propiedad y el nombre del simulacro.
En tu ejemplo:
@InjectMocks ServiceCaller classUnderTest;
@Mock SomeService serviceA;
@Mock SomeService serviceB;
Tenga en cuenta que no es necesario crear manualmente una instancia de clase al usar @InjectMocks.
Sin embargo, personalmente prefiero inyectar dependencias usando constructor. Hace que sea más fácil inyectar simulacros en las pruebas (solo llame a un constructor con sus simulacros, sin herramientas de reflejos o @InjectMocks
(que es útil, pero oculta algunos aspectos)). Además, al usar TDD, es claramente visible qué dependencias se necesitan para la clase probada y también IDE puede generar sus stubs de constructor.
Spring Framework admite completamente la inyección de constructor:
@Bean
public class ServiceCaller
private final SomeService serviceA;
private final SomeService serviceB;
@Autowired
public ServiceCaller(@Qualifier("serviceA") SomeService serviceA,
@Qualifier("serviceB") SomeService serviceB) ...
...
Este código se puede probar con:
@Mock SomeService serviceA;
@Mock SomeService serviceB;
//in a setup or test method
ServiceCaller classUnderTest = new ServiceCaller(serviceA, serviceB);
puede usar la propiedad “nombre” para definir su instancia de esta manera:
@Mock(name="serviceA") SomeService serviceA;
@Mock(name="serviceB") SomeService serviceB;
Cuando tiene dependencias del mismo tipo, mockito deja de inyectar las dependencias debido a propiedades del mismo tipo. Para resolver esto con referencia a @osiris256 de la siguiente manera:
class ServiceLayer
@Autowired
@Qualifier("bean1")
private InterfaceA typeA;
@Autowired
@Qualifier("bean2")
private InterfaceA typeB;
Su clase de prueba debe ser:
@RunWith(SpringRunner.class)
class ServiceLayerTest
@Mock(name = "typeA")
private InterfaceA typeA;
@Mock(name = "typeB")
private InterfaceA typeB;
@InjectMocks
ServiceLayer serviceLayer;
@Before
public void initialiseBeforeTest()
MockitoAnnotations.initMocks(this);
// here goes your test
@Test
public void test()
// use your when then .....
Nota: si está usando SpringRunner y usa @MockBean, esto no funcionará, debe reemplazarlo con @Mock(name=””) con referencia a @osiris256.
Si para ti ha sido de utilidad este post, sería de mucha ayuda si lo compartieras con el resto desarrolladores y nos ayudes a difundir nuestro contenido.