我有一个班级,我正在为我的服务注入代理。
Service service
{
private ServiceProxy proxy;
public Service(ServiceProxy proxy)
{
this.proxy = proxy;
}
}
对它的测试是:
ServiceTest
{
@Mock
ServiceProxy mockProxy;
Service service = new Service(mockProxy);
}
如果我像这样初始化我的类,当我想使用服务对象时,我总是得到NPE
。为什么Mockito
会这样做?有什么方法可以解决这个问题,而不是在每次测试中声明它?
答案 0 :(得分:6)
如果您使用的是Mockito 1.9.0或更高版本,那么实现您想要的最佳方式就是:
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@Mock
private ServiceProxy proxy;
@InjectMocks
private Service service;
@Test
public void test() {
assertNotNull(service);
assertNotNull(proxy);
}
}
首先是@RunWith(MockitoJUnitRunner.class)
声明会导致@Mock和@InjectMocks注释在没有任何显式初始化的情况下自动工作。第二件事是从Mockito 1.9.0开始@InjectMocks注释可以使用构造函数注入机制,这是 Service 类的最佳选择。
@InjectMocks的其他选项是 Setter injection 和 Field injection (参见docs BTW),但是你需要一个无参数构造函数来使用它们。
总结 - 您的代码无法正常工作,因为:
如果由于某种原因您不想使用@InjectMocks,唯一的方法是在测试方法体内或@Before带注释的setUp方法中构建 Service 对象。
答案 1 :(得分:2)
将您的测试类编写为此,它将使用模拟Service
初始化ServiceProxy
:
class ServiceTest
{
@Mock
ServiceProxy mockProxy;
//This will inject the "ServiceProxy" mock into your "Service" instance.
@InjectMocks
Service service = new Service(mockProxy);
@Before
public void init() {
//This will initialize the annotated mocks
MockitoAnnotations.initMocks(this);
}
@Test
public void test() {
...
}
}