Внедрение 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.
Ответ 2
Вы можете использовать что-то вроде Mockito, чтобы издеваться над линией, возвращенной во время тестирования. Это сообщение Stackoverflow имеет хороший пример:
spring 3 автоувеличивание и тестирование junit
Ответ 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>