Mockito:无法注入模拟对象时的测试行为
Mockito: Testing behavior when mock objects cant be injected
我有一个定义为
的方法
@Startup
@Singleton
public class PRCConnectionRunner {
@Inject
private ServiceStatus status;
private Timer connectorTimer = null;
public void destroy() {
connectorTimer.cancel();
status.stopped();
}
}
我想测试调用停止和取消的 destroy 行为。我可以通过注入一个模拟状态对象来轻松测试停止,如下所示
@Mock
ServiceStatus status;
@InjectMocks
PRCConnectionRunner prcConnection;
@Test
public void destroyShouldCallStatusStop() {
prcConnection.destroy();
Mockito.verify(status).stopped();
}
但是,由于我无法注入 connectorTimer,因为它是在 PRCConnectionRunner 中构建的 class,我如何测试 destroy 对 connectorTimer 调用 cancel()?
您可以使用 PowerMockito。它的 MemberModifier 允许设置私有成员,您可以 "inject" 计时器模拟并验证它。为了使用 PowerMockito,您应该通过 @RunWith(PowerMockRunner.class) 注释测试 class。它应该是这样的:
@RunWith(PowerMockRunner.class)
public class TestConnectionRunner
@Mock
ServiceStatus status;
@InjectMocks
PRCConnectionRunner prcConnection;
@Mock
Timer timerMock;
@Test
public void destroyShouldCallStatusStop() {
MemberModifier.field(PRCConnectionRunner.class, "connectorTimer").set(prcConnection, timerMock);
prcConnection.destroy();
Mockito.verify(status).stopped();
Mockito.verify(timerMock).cancel();
}
}
您可以在此 link
中找到更多 Mockito/PowerMock 个示例
我有一个定义为
的方法@Startup
@Singleton
public class PRCConnectionRunner {
@Inject
private ServiceStatus status;
private Timer connectorTimer = null;
public void destroy() {
connectorTimer.cancel();
status.stopped();
}
}
我想测试调用停止和取消的 destroy 行为。我可以通过注入一个模拟状态对象来轻松测试停止,如下所示
@Mock
ServiceStatus status;
@InjectMocks
PRCConnectionRunner prcConnection;
@Test
public void destroyShouldCallStatusStop() {
prcConnection.destroy();
Mockito.verify(status).stopped();
}
但是,由于我无法注入 connectorTimer,因为它是在 PRCConnectionRunner 中构建的 class,我如何测试 destroy 对 connectorTimer 调用 cancel()?
您可以使用 PowerMockito。它的 MemberModifier 允许设置私有成员,您可以 "inject" 计时器模拟并验证它。为了使用 PowerMockito,您应该通过 @RunWith(PowerMockRunner.class) 注释测试 class。它应该是这样的:
@RunWith(PowerMockRunner.class)
public class TestConnectionRunner
@Mock
ServiceStatus status;
@InjectMocks
PRCConnectionRunner prcConnection;
@Mock
Timer timerMock;
@Test
public void destroyShouldCallStatusStop() {
MemberModifier.field(PRCConnectionRunner.class, "connectorTimer").set(prcConnection, timerMock);
prcConnection.destroy();
Mockito.verify(status).stopped();
Mockito.verify(timerMock).cancel();
}
}
您可以在此 link
中找到更多 Mockito/PowerMock 个示例