我使用HK2进行依赖项注入,并希望在JUnit-Test的上下文中用Mockito模拟替换Singleton对象。
最简单的设置如下:
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-测试存根如下:
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中。
发布于 2017-05-17 12:17:36
你考虑过使用@Stub of B而不是Mock吗?要做到这一点,您可以在B的实现中添加“合同”:
@Service @Contract
public class B {
public String toString()
{
return "B";
}
}与其使用模拟,不如使用@Stub:
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类。
希望这能有所帮助!
https://stackoverflow.com/questions/43955436
复制相似问题