模拟类正在返回null而不是数据



在我的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",因此测试失败。我该怎么解决这个问题?

不要模拟您测试的对象。您所写的是"创建一个模拟对象,返回当前月份的七月"。但是这个mock对象没有实际行为,其他方法返回null。

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

不过,你编写类的方式可能不是最好的可测试方式;(

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

  1. 使用Mockito间谍而不是mock。这就像一个mock,但它是一个真实的对象,所有方法都有正常的行为,而不是默认的"无行为"。您可以截断间谍的getCurrentMonth方法,使其返回您想要的内容。

  2. 由于问题的真正原因是对new Date()的调用,因此可以使用时间助手,而不是直接在getCurrentMonth()方法中调用new Date()。我在回答这个问题时详细描述了这种技术

相关内容

  • 没有找到相关文章

最新更新