在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;
}
我在返回的实际数据中得到“空”,因此测试失败。我该如何解决?
答案 0 :(得分:0)
不要模拟您要测试的对象。您编写的是“创建一个模拟对象,该对象返回当月的7月”。但是此模拟对象没有实际行为,其他方法返回null。
当测试一个类时,您将模拟该类所需的对象(以隔离行为),而不是实际的类。在这里,您可以创建一个新的MetricsSerializer(通过使用new :),并调用它的方法serializeMethod并与当前日期(而不是7月)进行比较。
虽然您编写类的方式可能不是最好的可测试方式;)
答案 1 :(得分:0)
您的问题是您要模拟类,然后测试模拟对象,而不是测试“真实”对象。我可以想到两种可能的解决方案。
使用Mockito间谍代替模拟游戏。这就像一个模拟,但它是一个真实的对象,并且所有方法都具有其正常的行为,而不是默认情况下的“无行为”。您可以对间谍的getCurrentMonth
方法进行存根处理,以使其返回您想要的内容。
由于导致问题的真正原因是调用new Date()
,因此可以使用时间助手,而不用直接在new Date()
方法中调用getCurrentMonth()
。我已经在my answer to this question