2011-01-07 18 views
13

Estoy probando una clase que utiliza @Autowired utilizar para inyectar un servicio:@Service simulacro de unidad de pruebas de muelles

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> { 

    @Autowired 
    private RuleStore ruleStore; 

    // Some other methods 
} 

Pero cómo puedo burlarse ruleStore durante la prueba? No puedo entender cómo inyectar mi almacén de reglas falso en Spring y en el sistema de cableado automático.

Gracias

Respuesta

12

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); 
    } 
} 

Leer más sobre @InjectMocks en el javadoc Mockito o en un blog post que escribí acerca el tema hace algún tiempo.

Disponible a partir de Mockito 1.8.3, mejorado en 1.9.0.

10

Usted puede usar algo como Mockito burlarse de la rulestore regresaron durante la prueba. Este post Stackoverflow tiene un buen ejemplo de hacer esto:

spring 3 autowiring and junit testing

+0

Gracias, echaba de menos que uno. ReflectionTestUtils.setField (validator, "ruleStore", ruleStore); – Steve

+0

Sí, Mockito es bueno. Es simple y fácil de usar. – chris

2

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 primavera debería parecerse:

<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>