【问题标题】:Mockito: Testing behavior when mock objects cant be injectedMockito:无法注入模拟对象时的测试行为
【发布时间】: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


【解决方案1】:

您可以使用 PowerMockito。它的 MemberModifier 允许设置私有成员,您可以“注入”计时器模拟并对其进行验证。为了使用 PowerMockito,您应该通过 @RunWith(PowerMockRunner.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 示例

【讨论】:

  • MemberModifier 在什么包中?我的日食找不到它。我也相信最后一行你的意思是 timerMock 而不是 connectorTimer?Mockito.verify(connectorTimer).cancel();
  • 我相信你的意思是 powermock 而不是 Mockito?
  • 你是对的 - 我更新了答案(当代码没有运行时会发生什么)
猜你喜欢
  • 2014-04-16
  • 2021-01-26
  • 1970-01-01
  • 2021-05-28
  • 2017-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-23
相关资源
最近更新 更多