java - Spring注入(inject)模拟Bean

标签 java spring validation

我根据存储库创建了验证约束。

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/

相关文章:

java - JSR 303 - 定义的大小或 null

java - 如何使用简单的高斯分布算法将点分布在平面上?

java - assertEquals,什么是实际的,什么是预期的?

java - 如何使用 thymeleaf 获取变量值

java - 以编程方式添加 TextView 时 NestedScrollView 不滚动

java - java IoC框架如何保证线程安全?

spring - 如何在 quartz 中 Autowiring ?

javascript - vue.js VeeValidate - 自定义验证器正确编译错误但不切换错误类

java - 名称未找到异常 : While trying to lookup 'jdbc' only when publishing from Eclipse Kepler but not Indigo

java - MethodArgumentNotValidException 的 validator 仅处理相同类型的约束