簡體   English   中英

Spring注入了模擬Bean

[英]Spring inject mocked Bean

我根據存儲庫創建了驗證約束。

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可以輕松測試驗證器本身,但我想測試與驗證器的集成以檢查驗證消息。

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());
    }
}

我不知道如何使用PersonValidator的存儲庫在Validator注入PersonValidator

嘗試這個

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "context.xml")
public class PersonValidatorTest {

    @Autowired
    private Validator validator;
...

嘗試使用SpringJUnit4ClassRunner運行測試,並創建一個模擬存儲庫bean並使用spring的@Primary注釋進行注釋,或者在bean定義中將其標記為primary以進行自動裝配模擬存儲庫。

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

我更喜歡setter注入,這使得在測試期間注入模擬更簡單。

或者您也可以使用spring util類進行基於反射的注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM