【发布时间】:2014-09-26 23:09:13
【问题描述】:
我正在使用 Mockito 1.9.5 进行一些单元测试。我正在尝试将一个具体的类模拟注入一个具有私有接口字段的类中。这是一个例子:
我正在测试的课程
@Component
public class Service {
@Autowired
private iHelper helper;
public void doSomething() {
helper.helpMeOut();
}
}
我对这门课的测试
@RunWith(MockitoJUnitRunner.class)
public class ServiceTest {
@Mock
private iHelper helper;
@InjectMocks
private Service service;
@Before
public void setup() {
service = new Service();
}
@Test
public void testStuff() {
doNothing().when(helper).helpMeOut();
service.doSomething();
}
}
当尝试在 doSomething() 中调用 helper.helpMeOut() 时,此代码会引发 NullPointerException。我调试并发现运行测试时 helper 为空。我还尝试将 iHelper 更改为具体的类 Helper,并且发生了同样的问题。
有什么建议吗?如何让 Mockito 正确地将模拟注入接口私有字段?
【问题讨论】:
-
您所做的完全正确。这应该有效。事实上,它对我有用;我经常使用这种方法。如果您希望真正的 Mockito 专家看到它,您可以尝试将其发布到 Mockito 用户列表。
-
为什么不将
helperfield 可见性更改为默认值?我猜该服务与其测试在同一个包中。 -
@ponomandr 这无济于事。
@InjectMocks代码有一些反射魔法,可以设置私有字段。 -
service怎么样?它是否被实例化了?虽然不太可能,但您的 IDE/控制台可能没有选择 mockito 的运行器。 -
抱歉,我忘记在实例化服务的地方添加 @Before 方法。我已经编辑了代码以反映这一点。