如果您确实想要 纯
单元测试而不是集成测试,则可以依靠注释
@Mock来模拟服务
FilterDataProvider并将
@InjectMocks模拟插入到的实例中
FilterDataController。
然后,您可以提出3个测试:
- 日期正确无误的一项测试,
- 日期正确但相等的另一个
- 最后一个日期不正确的日期将抛出
ValueNotAllowedException
,可以使用进行开箱测试@Test(expected = ValueNotAllowedException.class)
。
如果需要确保
filterDataProvider.getPossibleCountries(startDate,newEndDate)已使用期望的参数调用了该方法,则需要使用
verify。
该代码将是这样的:
@RunWith(MockitoJUnitRunner.class)public class FilterDataControllerTest { @Mock FilterDataProvider filterDataProvider; @InjectMocks FilterDataController controller; @Test(expected = ValueNotAllowedException.class) public void testGetPossibleFilterDataIncorrectDates() { controller.getPossibleFilterData(new Date(1L), new Date(0L)); } @Test public void testGetPossibleFilterDataCorrectDates() { // Make the mock returns a list of fake possibilities Mockito.when( filterDataProvider.getPossibleCountries( Mockito.anyObject(), Mockito.anyObject() ) ).thenReturn(Arrays.asList("foo", "bar")); ResponseEntity<Object> response = controller.getPossibleFilterData( new Date(0L), new Date(1L) ); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); // Make sure that // filterDataProvider.getPossibleCountries(new Date(0L), new Date(1L)) // has been called as expected Mockito.verify(filterDataProvider).getPossibleCountries( new Date(0L), new Date(1L) ); // Test response.getBody() here } @Test public void testGetPossibleFilterDataEqualDates() { // Make the mock returns a list of fake possibilities Mockito.when( filterDataProvider.getPossibleCountries( Mockito.anyObject(), Mockito.anyObject() ) ).thenReturn(Arrays.asList("foo", "bar")); // Call the controller with the same dates ResponseEntity<Object> response = controller.getPossibleFilterData( new Date(1L), new Date(1L) ); Assert.assertEquals(HttpStatus.OK, response.getStatusCode()); Mockito.verify(filterDataProvider).getPossibleCountries( new Date(1L), new Date(TimeUnit.DAYS.toMillis(1)) ); // Test response.getBody() here }}


