19

我正在测试一个使用 @Autowired 注入服务的类:

public class RuleIdValidator implements ConstraintValidator<ValidRuleId, String> {

    @Autowired
    private RuleStore ruleStore;

    // Some other methods
}

但是如何在测试期间模拟 ruleStore?我不知道如何将我的模拟 RuleStore 注入 Spring 和自动装配系统。

谢谢

4

3 回答 3

19

使用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);
    }
}

在 Mockito javadoc 或我前段时间写的关于该主题的博客文章中阅读有关@InjectMocks的更多信息。

从 Mockito 1.8.3 开始可用,在 1.9.0 中增强。

于 2012-11-28T22:41:34.547 回答
10

您可以使用 Mockito 之类的东西来模拟测试期间返回的规则库。这个 Stackoverflow 帖子有一个很好的例子:

spring 3 自动装配和junit测试

于 2011-01-07T09:33:50.687 回答
2

您可以执行以下操作:

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 应如下所示:

<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>
于 2013-03-21T14:43:38.530 回答