【发布时间】:2016-05-24 15:22:54
【问题描述】:
我正在为一个方法使用JUnit API 编写一个测试用例。我已经涵盖了所有场景,但让我感到困难的是if 块。当我将鼠标悬停在这条线上时,Cobertura 为每个条件声明 50% 50%,但我不完全确定如何解决这个问题。
待测方法:
protected boolean isDateWithinTimelineRange( Calendar date, ServiceContext ctx ) {
Calendar end = (Calendar)ctx.getParameter( ServiceConstants.TIMELINE_END );
Calendar start = (Calendar)ctx.getParameter( ServiceConstants.TIMELINE_BEGIN );
if( end != null && start != null ) {
if( date.getTimeInMillis() >= start.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis() ) {
return true;
} else {
return false;
}
}
return true;
}
JUnit 测试用例:
@Test
public void testIsDateWithinTimelineRange() throws Exception {
ServiceContext context = Mockito.mock(ServiceContext.class);
Calendar calender = Mockito.mock(Calendar.class);
Mockito.when(context.getParameter(Mockito.anyString())).thenReturn(calender);
TestBaseTimelineProvider provider = new TestBaseTimelineProvider();
boolean answer = provider.isDateWithinTimelineRange(calender, context);
assertNotNull(answer);
assertTrue(provider.isDateWithinTimelineRange(calender, context));
// Testing for NULL condition
context = Mockito.mock(ServiceContext.class);
calender = Mockito.mock(Calendar.class);
Mockito.when(context.getParameter(Mockito.anyString())).thenReturn(null);
provider = new TestBaseTimelineProvider();
answer = provider.isDateWithinTimelineRange(calender, context);
assertNotNull(answer);
assertTrue(provider.isDateWithinTimelineRange(calender, context));
// Start date set to null
context = Mockito.mock(ServiceContext.class);
calender = Mockito.mock(Calendar.class);
ServiceConstants constants = new ServiceConstants();
Mockito.when(context.getParameter(ServiceConstants.TIMELINE_END)).thenReturn(calender);
provider = new TestBaseTimelineProvider();
answer = provider.isDateWithinTimelineRange(calender, context);
assertNotNull(constants);
// End date set to null
context = Mockito.mock(ServiceContext.class);
calender = Mockito.mock(Calendar.class);
constants = new ServiceConstants();
Mockito.when(context.getParameter(ServiceConstants.TIMELINE_BEGIN)).thenReturn(calender);
provider = new TestBaseTimelineProvider();
answer = provider.isDateWithinTimelineRange(calender, context);
assertNotNull(constants);
}
让我感到困惑的是我正在模拟的参数date,它决定了end 和start 变量的值。
if( date.getTimeInMillis() >= start.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis() ) {} 是我要覆盖的行。
谢谢
【问题讨论】:
-
你不需要告诉模拟在方法
getTimeInMillis()中返回什么,例如:Mockito.when(calender.getTimeInMillis()).thenReturn(1L);并解决这个问题吗?目前,调用date.getTimeInMillis()不会返回任何内容,因为date对象已被模拟,但您的getTimeInMillis()方法没有设置任何返回 -
您介绍了两种返回 true 的情况,但从未介绍过返回 false 的(两种)情况(第一项不为真,或第一项为真,第二项不为真)。您应该至少有一种,可能有两种情况,您 assertFalse(provider.isDateWithinTimelineRange) 对该条件进行有效测试。
-
是的,实际上我正在调试它,所以得到了这两个相似的测试用例。我正在研究 getTimeMillis()。
标签: java junit mockito cobertura