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 个示例