首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为Java "@Inject private Instance<T> implementations“使用一个接口的多个mock?

如何为Java "@Inject private Instance<T> implementations“使用一个接口的多个mock?
EN

Stack Overflow用户
提问于 2016-05-02 22:23:13
回答 1查看 297关注 0票数 1

我有一个接口:

代码语言:javascript
复制
public interface Service {
    void doService();
}

和一个类:

代码语言:javascript
复制
public class ServiceUser {
    @Inject
    @Any
    private Instance<Service> serviceImplementations;

    public void work() {
        serviceImplementations.forEach(service -> service.doService());
    }
}

和一个测试用例:

代码语言:javascript
复制
public class ServiceUserTest {
    @Mock
    private Service firstImpl;

    @Mock
    private Service secondImpl;

    @InjectMocks
    private ServiceUser serviceUser;

    @Test
    public void testAllImplementationsCalled() {
          serviceUser.work();

          verify(firstImpl).doService();
          verify(secondImpl).doService();
    }
}

当我运行测试用例时,我在ServiceUser中得到一个NullPointerException,而在调试时serviceImplementations是空的。如果我在ServiceUser中创建了两个字段,我就可以注入这两个实例(两个mock都是注入的,我在调试期间检查过了)。

代码语言:javascript
复制
public class ServiceUser {
    @Inject
    @Any
    private Instance<Service> serviceImplementations;

    @EJB
    private Service firstImpl;

    @EJB
    private Service secondImpl;

    public void work() {
        serviceImplementations.forEach(service -> service.doService());
    }
}

我怎么才能让它工作呢?

EN

回答 1

Stack Overflow用户

发布于 2016-05-03 01:50:26

令人惊讶的是,就像在Instance<Service> serviceInstance = TestingInstance.of(firstImpl, secondImpl);中一样,我找不到一个好的现有的Instance<T>的伪或测试替身。

您可能想创建一个-不使用Mockito,而是作为一个实际的实现-并测试和使用它。该接口相对较小,特别是如果您只是在select方法上抛出UnsupportedOperationException,那么您将拥有一个可以在所有测试用例中使用的实现。

因为它不是mock,所以您需要@InjectMocks的替代品;考虑到@InjectMocks在依赖项更改时的脆弱性,这可能不是一件坏事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36984805

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档