【问题标题】:How to not Mock an object when using Mockito and CDI?使用 Mockito 和 CDI 时如何不模拟对象?
【发布时间】:2015-11-30 16:30:24
【问题描述】:

我有一个对象读取这样的配置属性:

@ApplicationScoped
    public class Configuration {

    @Inject
    @Config(value = "endpoint.base", defaultValue = "http://localhost:52885/consumers")
private String base;

    public String getBase() { return base; } 

}

这个对象被注入到这样的服务对象中:

public class LoyaltyService {

    final Sender sender;

    final Configuration config;

    @Inject
    public LoyaltyService(Sender sender, Configuration config) {
        this.sender = sender;
        this.config = config;
    }
} 

我现在正在使用 Mockito 测试这个服务对象。我想模拟 Sender 对象,但我不想模拟配置,或者至少我只想使用对象内部定义的默认值。

如何在 Test 对象中做到这一点?

例如,我尝试了以下方法:

public class LoyaltyServiceTest {

    @Mock
    private Sender sender;

    @Inject
    private Configuration config;

    private LoyaltyService target;

    @Before
    public void init() {
        MockitoAnnotations.initMocks(this);
        when (sender.post(anyString(), anyString())).thenReturn("Post Success");
        target  =new LoyaltyService(sender, config);
    }
}

CDI 似乎根本不会注册 Config 对象。这是如何运作的?谢谢!

【问题讨论】:

    标签: java unit-testing mockito


    【解决方案1】:

    CDI 似乎根本不会注册 Config 对象。

    运行测试时,CDI bean 没有被初始化,只有模拟对象被初始化。

    MockitoAnnotations.initMocks 只初始化

    使用给定 testClass 的 Mockito 注释注释的对象:@Mock、@Spy、@Captor、@InjectMocks。

    您需要在测试类中使用像cdi-unitPax Exam 这样的CDI 测试框架来为您创建非模拟bean。

    【讨论】:

    • 谢谢,那些文件到处都是,没有意识到,但经过一次又一次的尝试,我觉得是这样的。你所说的只是证实了这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多