La inyección de @Service mock para las pruebas de unidad de resorte
-
30-09-2019 - |
Pregunta
Estoy probando una clase que usan usos @Autowired para inyectar un servicio:
public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {
@Autowired
private RuleStore ruleStore;
// Some other methods
}
Pero cómo puedo ruleStore simulada durante la prueba? No puedo encontrar la manera de inyectar mi RuleStore simulacro en la primavera y en el sistema de auto-cableado.
Gracias
Solución
Es muy fácil con Mockito :
@RunWith(MockitoJUnitRunner.class)
public class RuleIdValidatorTest {
@Mock
private RuleStore ruleStoreMock;
@InjectMocks
private RuleIdValidator ruleIdValidator;
@Test
public void someTest() {
when(ruleStoreMock.doSomething("arg")).thenReturn("result");
String actual = ruleIdValidator.doSomeThatDelegatesToRuleStore();
assertEquals("result", actual);
}
}
Más información sobre el @InjectMocks en el javadoc Mockito o en un href="http://www.jayway.com/2012/02/25/mockito-and-dependency-injection/" rel="nofollow noreferrer"> blog que escribí sobre el tema hace algún tiempo.
Disponible a partir del Mockito 1.8.3, 1.9.0 mejorado en.
Otros consejos
Se puede usar algo como Mockito burlarse de la rulestore devuelto durante la prueba. Este post Stackoverflow tiene un buen ejemplo de hacer esto:
Se puede hacer lo siguiente:
package com.mycompany;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.DependsOn;
import org.springframework.stereotype.Component;
@Component
@DependsOn("ruleStore")
public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {
@Autowired
private RuleStore ruleStore;
// Some other methods
}
Y su Contexto resorte debe el siguiente aspecto:
<context:component-scan base-package="com.mycompany" />
<bean id="ruleStore" class="org.easymock.EasyMock" factory-method="createMock">
<constructor-arg index="0" value="com.mycompany.RuleStore"/>
</bean>