unitarias - test en java
Inyección de @Servicio simulado para pruebas unitarias de primavera. (3)
Estoy probando una clase que usa el uso de @Autowired para inyectar un servicio:
public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {
@Autowired
private RuleStore ruleStore;
// Some other methods
}
Pero, ¿cómo puedo burlar a ruleStore durante las pruebas? No puedo averiguar cómo inyectar mi RuleStore simulado en Spring y en el sistema de cableado automático.
Gracias
Es bastante 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);
}
}
Lea más sobre @InjectMocks en el javadoc de Mockito o en una publicación del blog que escribí sobre el tema hace algún tiempo.
Disponible a partir de Mockito 1.8.3, mejorado en 1.9.0.
Puedes 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 tu Contexto de Primavera debería ser como:
<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>
Puedes usar algo como Mockito para burlarte de la regla devuelta durante las pruebas. Esta publicación de tiene un buen ejemplo de hacer esto: