我根据存储库创建了验证约束。
public class PersonValidator implements ConstraintValidator {
@Autowired
private PersonRepository personRepository;
@Override
public void initialize(PersonValidator personValidator) {
}
@Override
public boolean isValid(Person person, ConstraintValidatorContext context) {
return null != repository.findByName(person.getName());
}
}
通过模拟 PersonValidator
来测试 validator 本身很容易,但我想测试与 validator 的集成以检查验证消息。
public class PersonValidatorTest {
@Autowired
private Validator validator;
@Test
public void integration() {
Person person = new Person();
person.setName("person");
Set<ConstraintViolation<Person>> constraintViolations = validator.validate(person);
Assert.assertEquals(0, constraintViolations.size());
}
}
我不知道如何使用模拟存储库在 Validator
中注入(inject) PersonValidator
。
最佳答案
尝试使用 SpringJUnit4ClassRunner 运行测试,并创建一个模拟存储库 bean 并使用 spring 的 @Primary 注释进行注释或在 bean 定义中标记为主要,以便测试 Autowiring 模拟存储库。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/context.xml", "/test-context.xml"})
public class PersonValidatorTest {
@Autowired
private Validator validator;
....
您可以使用mockito工厂bean创建模拟存储库,如下所示
public class MockitoFactoryBean<T> implements FactoryBean<T> {
private Class<T> classToBeMocked;
public MockitoFactoryBean(Class<T> classToBeMocked) {
this.classToBeMocked = classToBeMocked;
}
@Override
public T getObject() throws Exception {
return Mockito.mock(classToBeMocked);
}
....
然后为测试存储库创建 spring 的上下文文件“test-context.xml”
<bean id="mockRepository" primary="true" class="com.test.mock.MockitoFactoryBean">
<constructor-arg value="com....PersonRepository"/>
</bean>
关于java - Spring注入(inject)模拟Bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23258462/