模拟类返回null而不是数据

时间:2018-08-01 21:25:36

标签: java testing junit null mockito

在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;
    }

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

2 个答案:

答案 0 :(得分:0)

不要模拟您要测试的对象。您编写的是“创建一个模拟对象,该对象返回当月的7月”。但是此模拟对象没有实际行为,其他方法返回null。

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

虽然您编写类的方式可能不是最好的可测试方式;)

答案 1 :(得分:0)

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

  1. 使用Mockito间谍代替模拟游戏。这就像一个模拟,但它是一个真实的对象,并且所有方法都具有其正常的行为,而不是默认情况下的“无行为”。您可以对间谍的getCurrentMonth方法进行存根处理,以使其返回您想要的内容。

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

  3. 中详细介绍了该技术