【问题标题】:Why isnt Mockito doThrow throwing an Exception in this case? zero interactions with mock为什么在这种情况下 Mockito doThrow 不抛出异常?与 mock 的零交互
【发布时间】:2019-09-10 18:58:51
【问题描述】:

我正在测试的方法(setEventHubDataPayload 方法抛出 JSONException 和 JsonProcessingException):

public class EventHubMapper {

//inits

public byte[] toEventDataJsonByteArray(UserRecord inbound) {
    EventHubDto ehDto = new EventHubDto();

    ehDto.setEventTypeVersion(inbound.getVersion());
    ehDto.setEventId(inbound.getNotificationId());

    JSONObject eventJson = new JSONObject(ehDto);

    try {
        eventJson.put("data", setEventHubDataPayload(ehDto, inbound));
    } catch (JSONException e) {
        analytics.trackError(AnalyticsConstants.EventHub.JSON_MAPPING_ERROR, e.toString());
    } catch (JsonProcessingException e) {
        analytics.trackError(AnalyticsConstants.EventHub.JSON_PROCESSING_ERROR, e.toString());
    }

    return eventJson.toString().getBytes();
}

}

单元测试代码:

 @Test
public void toEventDataByteArray_JsonException() throws JSONException, JsonProcessingException {
    EventHubMapper ehmMock = Mockito.spy(eventHubMapper);

    doThrow(new JSONException("blah")).when(ehmMock).setEventHubDataPayload(any(), any());

    eventHubMapper.toEventDataJsonByteArray(setUpMockUserRecord());

    verify(analytics, times(1)).trackError( AnalyticsConstants.EventHub.JSON_MAPPING_ERROR, new JSONException("blah").toString());

}

我尝试使用更具体的匹配器...例如:any(EventHubDto.class) 或 any(UserRecord.class) 并得到相同的结果:

Wanted but not invoked:
analytics.trackError(
"EventHub_Publish_Error",
""
;

还有

Actually, there were zero interactions with this mock. 

这是怎么回事?

【问题讨论】:

  • 您希望使用 PUBLISH_ERROR 和空字符串调用 trackError。但是你实际上用 JSON_MAPPING_ERROR 和 e.toString() 来调用它。 PUBLISH_ERROR 是否等于 JSON_MAPPING_ERROR 值? e.toString() 的值是多少?是空字符串吗?
  • 这些是拼写错误,我已修复,仍然有同样的错误,@noname 如果您查看失败原因,则没有提及参数
  • 您正在对ehmMock 实例进行doThrow 调用。而setEventHubDataPayload 的实际调用发生在eventHubMapper 实例上。所以模拟 ehmMock 没有被使用。尝试做ehmMock.toEventDataJsonByteArray

标签: spring unit-testing junit mockito powermock


【解决方案1】:

我认为你需要在测试时像下面这样调用。

   ehmMock.toEventDataJsonByteArray(setUpMockUserRecord());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多