2011-01-07 7 views
13

ich eine Klasse bin testen, die @Autowired verwendet verwenden, um einen Dienst zu injizieren:Mock @Service für Federeinheit Spritzen testet

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> { 

    @Autowired 
    private RuleStore ruleStore; 

    // Some other methods 
} 

Aber wie kann ich verspotten ruleStore während der Prüfung? Ich kann nicht herausfinden, wie ich meinen RuleStore in Spring und in das Auto-Wiring-System injizieren kann.

Dank

Antwort

12

Es ist ganz einfach mit 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); 
    } 
} 

mehr über Lese @InjectMocks im Mockito javadoc oder in einem blog post, die ich schrieb über das Thema vor einiger Zeit.

Verfügbar ab Mockito 1.8.3, erweitert in 1.9.0.

10

Sie so etwas wie Mockito verwenden können die rulestore zu verspotten während der Prüfung zurück. Diese Stackoverflow Post hat ein gutes Beispiel, dies zu tun:

spring 3 autowiring and junit testing

+0

Danke, habe ich verpasst, dass man. ReflectionTestUtils.setField (Validator, "ruleStore", ruleStore); – Steve

+0

Ja, Mockito ist gut. Es ist einfach und einfach zu bedienen. – chris

2

Sie können folgendes tun:

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 
} 

Und Ihre Frühling Zusammenhang sollte wie folgt aussieht:

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