【发布时间】:2016-09-01 01:10:42
【问题描述】:
我有一个方法定义为
@Startup
@Singleton
public class PRCConnectionRunner {
@Inject
private ServiceStatus status;
private Timer connectorTimer = null;
public void destroy() {
connectorTimer.cancel();
status.stopped();
}
}
我想测试它调用停止和取消的破坏行为。我可以通过注入如下状态的模拟对象来轻松测试停止
@Mock
ServiceStatus status;
@InjectMocks
PRCConnectionRunner prcConnection;
@Test
public void destroyShouldCallStatusStop() {
prcConnection.destroy();
Mockito.verify(status).stopped();
}
但是,由于我无法注入 connectorTimer,因为它是在 PRCConnectionRunner 类中构造的,我如何测试在 connectorTimer 上销毁调用 cancel()?
【问题讨论】:
-
一般来说,这对于 Mockito(或 EasyMock)是不可能的,因为在测试中创建的每个模拟对象都必须以某种方式传入到被测对象中。要模拟内部创建/获取的对象,除了 Mockito 之外,您还需要使用 PowerMock,或者使用 JMockit 库。
-
所以我测试不正确?还是我的设计不正确?
-
使用普通的反射来设置
Timer字段怎么样?这基本上是@Inject工作方式的基础 -
我没有足够的信息说您的设计不正确,或者您的测试不正确。
-
@SpaceTrucker 即使我用反射注入了计时器,我如何验证方法 cancel() 是否被调用?
标签: jakarta-ee dependency-injection mocking tdd mockito