在我的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,并与当前日期(而不是七月(进行比较。
不过,你编写类的方式可能不是最好的可测试方式;(
您的问题是模拟类,然后测试模拟对象,而不是测试"真实"对象。我能想到两种可能的解决方案。
-
使用Mockito间谍而不是mock。这就像一个mock,但它是一个真实的对象,所有方法都有正常的行为,而不是默认的"无行为"。您可以截断间谍的
getCurrentMonth
方法,使其返回您想要的内容。 -
由于问题的真正原因是对
new Date()
的调用,因此可以使用时间助手,而不是直接在getCurrentMonth()
方法中调用new Date()
。我在回答这个问题时详细描述了这种技术