首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在HK2中使用Mockito?

如何在HK2中使用Mockito?
EN

Stack Overflow用户
提问于 2017-05-13 16:29:35
回答 1查看 797关注 0票数 1

我使用HK2进行依赖项注入,并希望在JUnit-Test的上下文中用Mockito模拟替换Singleton对象。

最简单的设置如下:

代码语言:javascript
复制
import javax.inject.Inject;
import org.jvnet.hk2.annotations.Service;

@Service
public class A {

    @Inject
    private B b;

    public String test() {
        return b.toString();
    }

}

@Service
public class B {

    public String toString()
    {
        return "B";
    }

}

而JUnit-测试存根如下:

代码语言:javascript
复制
import static org.junit.Assert.*;

import javax.inject.Inject;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.jvnet.hk2.testing.junit.HK2Runner;
import org.mockito.Mockito;
import org.mockito.junit.MockitoJUnitRunner;

@RunWith(MockitoJUnitRunner.class)
public class MockTest extends HK2Runner {

    private B bMock = Mockito.mock(B.class);

    @Inject
    private A a;

    @Test
    public void test() {
        Mockito.when(bMock.toString()).thenReturn("Mock");
        assertEquals("Mocking worked", "Mock", a.test());
    }

}

我想要B的模型被注入A而不是真实的物体。如何对HK2进行全局配置,以便对B的每个实例使用模拟?我已经知道可以通过构造函数使用injection将B局部注入到A中。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-17 12:17:36

你考虑过使用@Stub of B而不是Mock吗?要做到这一点,您可以在B的实现中添加“合同”:

代码语言:javascript
复制
@Service @Contract
public class B {

    public String toString()
    {
        return "B";
    }

}

与其使用模拟,不如使用@Stub:

代码语言:javascript
复制
public class MockTest extends HK2Runner {

    @Inject
    private A a;

    @Test
    public void test() {
        assertEquals("Mocking worked", "Mock", a.test());
    }

    @Stub @Rank(1)
    public static abstract class BStub extends B {
        public String toString() {
            return "Mock";
        }

    }

}

为了使其工作,HK2元数据生成器应该在编译期间测试的类路径中,这样它就可以生成存根。您将@Rank(1)放在存根上,以确保它被选中而不是原始的B类。

希望这能有所帮助!

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

https://stackoverflow.com/questions/43955436

复制
相关文章

相似问题

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