メソッドのためにJUnit
APIを使用してテストケースを作成しています。私はすべてのシナリオをカバーしましたが、私に苦労しているのはif
ブロックです。私はこの行にカーソルを合わせると、Cobertura
は各条件に対して50%50%と述べていますが、これをどのようにカバーするのか正確にはわかりません。テスト中のJUnitとMockitoによるブランチカバレッジ
方法:
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);
}
私を混乱させる何が、私はモックとend
とstart
変数の値を決定していたパラメータdate
です。
if(date.getTimeInMillis() >= start.getTimeInMillis() && date.getTimeInMillis() <= end.getTimeInMillis()) {}
は、私がカバーしたいラインです。
おかげ
'getTimeInMillis()'メソッドで返すものを模擬する必要はありません。たとえば、 'Mockito.when(calender.getTimeInMillis())。then return(1L); ? 'date.getTimeInMillis()'を呼び出すと、 'date'オブジェクトが偽装されたために何も返されませんでしたが、' getTimeInMillis() 'メソッドのために何も返さないように設定されました。 – Draken
偽(最初の項目が真ではない、または最初の項目が真ではなく、2番目の項目が真ではない)を返す場合は、2つのケースをカバーしませんでした。その条件に対して有効なテストでassertFalse(provider.isDateWithinTimelineRange)が少なくとも1つ、おそらく2つのケースを持つ必要があります。 – user1676075
ええ、実際に私はそれを介してデバッグしていたので、それらの2つの同様のテストケースを得ました。私はgetTimeMillis()に取り組んでいます。 –