Внедрение mock @Service для Spring модульных тестов

Я тестирую класс, который использует use @Autowired для ввода услуги:

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {

    @Autowired
    private RuleStore ruleStore;

    // Some other methods
}

Но как я могу издеваться над ruleStore во время тестирования? Я не могу понять, как вводить мой макет RuleStore в Spring и в систему автоматической проводки.

Спасибо

Ответы

Ответ 1

Это легко с 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);
    }
}

Подробнее о @InjectMocks в Mockito javadoc или в блоге post, который я написал о теме некоторое время назад.

Доступно с версии Mockito 1.8.3, расширенной в версии 1.9.0.

Ответ 3

Вы можете выполнить следующие действия:

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
}

И ваш контекст Spring должен выглядеть так:

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