如果您使用的是 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 注释可以使用构造函数注入机制,这是服务类的最佳选择。
@InjectMocks 的其他选项是Setter 注入和字段注入(请参阅文档BTW),但您需要一个无参数构造函数才能使用它们。
总结一下-您的代码无法正常工作,因为:
- 您没有使用 MockitoJUnitRunner 或 MockitoAnnotations.initMocks(this) 所以 @Mock 注释无效
- 即使满足上述要求,您的示例也会失败,因为mockProxy将在构建测试后初始化,并且在测试类构建期间尝试初始化您的服务,因此它接收 null mockProxy引用。
如果出于某种原因您不想使用@InjectMocks,唯一的方法是在测试方法主体或@Before 注释的setUp 方法中构造您的Service对象。