使用Mockito和CDI时如何模拟对象?

时间:2015-11-30 16:30:25

标签: java unit-testing mockito

我有一个对象读取如下配置属性:

@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对象。这是如何运作的?谢谢!

1 个答案:

答案 0 :(得分:1)

  

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

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

MockitoAnnotations.initMocks仅初始化

  

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

您需要在测试类中使用CDI测试框架(如cdi-unitPax Exam)来为您创建非模拟bean。