2011-01-07 2 views
13

sto testando una classe che utilizza utilizzare @Autowired per iniettare un servizio:Iniezione @Service finto per unità di primavera mette alla prova

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> { 

    @Autowired 
    private RuleStore ruleStore; 

    // Some other methods 
} 

Ma come posso prendere in giro ruleStore durante i test? Non riesco a capire come iniettare il mio finto RuleStore in primavera e nel sistema di cablaggio automatico.

Grazie

risposta

12

E 'abbastanza facile 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); 
    } 
} 

Per saperne di più @InjectMocks nel javadoc Mockito o in un blog post che ho scritto su l'argomento qualche tempo fa.

Disponibile da Mockito 1.8.3, potenziato in 1.9.0.

10

Si può usare qualcosa come Mockito per deridere il rulestore restituiti durante il test. Questo post StackOverflow ha un buon esempio di fare questo:

spring 3 autowiring and junit testing

+0

Grazie, ho mancato quello. ReflectionTestUtils.setField (validatore, "ruleStore", ruleStore); – Steve

+0

Sì, Mockito è bravo. È semplice e facile da usare. – chris

2

Si può fare seguente:

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 
} 

E la tua Primavera Contesto dovrebbe apparire come:

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