Saltar al contenido

Cómo inyectar múltiples simulacros de la misma interfaz

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *