【问题标题】:Mocking class is returning null instead of data模拟类返回 null 而不是数据
【发布时间】:2018-08-01 21:25:35
【问题描述】:

在我的 Junit 测试中,我在 Junit 测试中执行以下操作:

   @Before
    public void setUp() throws Exception {

        reportQueryParams = ReportQueryParams.builder()
            .id("07")
            .build();
    }

    @Test
    public void tabSerializerTest() {
        MetricsSerializer mockMonth = mock(MetricsSerializer.class);
            when(mockMonth.getCurrentMonth()).thenReturn("July");
        String tabSeparated = mockMonth.serializeMetrics(reportQueryParams);
        String expected = new StringBuilder().append("074")
            .append("\t")
            .append("July")
            .toString();
        assertEquals(expected, tabSeparated);

}

我正在测试的功能:

public String serializeMetrics(final ReportQueryParams reportQueryParams) {
    stringJoiner = new StringJoiner("\t");
    addValueFromString(reportQueryParams.getId());
    addValueFromString(getCurrentMonth());
    return stringJoiner.toString();
}

public String getCurrentMonth() {
    DateFormat monthFormat = new SimpleDateFormat("MMMMM");
    return monthFormat.format(new Date());
}


private void addValueFromString(final String value) {
    stringJoiner.add(value);
}

我的 ReportQueryParams 类:

  public class ReportQueryParams {
        private String id;
    }

我在返回的实际数据中得到“null”,因此测试失败。我该如何解决这个问题?

【问题讨论】:

    标签: java testing junit null mockito


    【解决方案1】:

    不要模拟您测试的对象。您所写的是“创建一个返回当月的七月的模拟对象”。但是这个模拟对象没有真正的行为,其他方法返回 null。

    当您测试一个类时,您模拟了该类所需的对象(为了隔离行为)而不是实际的类。在这里,您可以创建一个新的 MetricsSerializer(通过使用 new :) 并调用它的方法 serializeMethod 并与当前日期(而不是 7 月)进行比较。

    您编写课程的方式可能不是最好的可测试方式;)

    【讨论】:

    • 我最初尝试的是:MetricsSerializer metricsSerializer = new MetricsSerializer();然后我打电话。字符串 tabSeparated = metricsSeriazlier.serializeMetrics(reportQueryParams, remoteUser);这会返回数据,但我想得到一些东西来与当月进行比较。如何与 7 月进行比较?
    • 您无法与 7 月进行比较,因为您的方法是以使用当前日期的方式制作的。如果您与七月进行比较,它将失败,并且该方法的正确行为是不返回七月。只需在测试中创建一个新的 Date() 并比较月份
    【解决方案2】:

    您的问题是您正在模拟类,然后测试模拟对象,而不是测试“真实”对象。我可以想到两种可能的解决方案。

    1. 使用 Mockito Spy 而不是 mock。这就像一个模拟,但它是一个真实的对象,并且方法都有它们的正常行为,而不是默认情况下“没有行为”。你可以存根你的间谍的getCurrentMonth 方法,让它返回你想要的。

    2. 由于您的问题的真正原因是调用new Date(),您可以使用时间助手,而不是直接在您的getCurrentMonth() 方法中调用new Date()。我在my answer to this question

    3. 中详细描述了这种技术

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-22
      • 2020-07-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多