从 JMockit 转换为 Mockito 框架

Convert from JMockit to Mockito framework

我见过一些人从 Mockito 转向 JMockit 的例子,但我做的恰恰相反。我不太确定如何处理 @Mocked 参数。这些只是成为@Mock 实例变量吗?我认为 NonStrictExpectations 子句应该变成 "when" 子句,例如:

when(rpManager.login()).thenReturn(true);

验证部分变为 "verify" 子句。

这是我正在转换的完整测试用例的示例。

@Test
public void testGetOffersUnsuccessfulResponse(@Mocked final RPRequest mockRequest, @Mocked final RPResponse mockResponse) {

    final String sessionId = "123";

    new NonStrictExpectations() {{
        rpManager.login(); returns(true);
        rpManager.newRequest(anyString); returns(mockRequest);
        mockRequest.sendRequest(); returns(mockResponse);
        mockResponse.isSuccess(); returns(false);
    }};

    final EpiphanyConnection connection = new EpiphanyConnection(getDummyConnectionProperties(), getDummyActionMapping());
    assertTrue(connection.connect());

    final InteractionContext interactionContext = new InteractionContext();
    interactionContext.setRequestContext(new RequestContext());
    interactionContext.getRequestContext().setAction(getDummyActionMapping().keySet().iterator().next());

    interactionContext.setUserContext(new UserContext());
    interactionContext.getUserContext().setSessionId(sessionId);

    final OfferTranslator offerTranslator = connection.fetchCommunications(interactionContext);
    assertNotNull(offerTranslator);

    new Verifications() {{

        // failure in the below likely indicates mismatched JSON string.
        mockRequest.setData("SessionId", sessionId);
        mockRequest.sendRequest(); times=1;
    }};
}

Mockito,你是对的,不期望任何 when 子句是实际需要的。顾名思义,当这个和那个发生时,就做点什么——如果没有发生,那也没关系。

要确保确实调用了某些内容,请使用 verify

@Mock 将创建一个模拟实例,正确:

@Mock
private MyService service; // will result in a mocked "MyService" instance

不要忘记调用 MockitoAnnotations.initMock(this); 或使用 @RunWith(MockitoJUnitRunner.class) 以确保实际使用注释。