How to check if-statement in method using Mockito and JUnit?

前端 未结 3 684
时光说笑
时光说笑 2021-01-15 09:05

I have method that I should test. Code (of course some parts were cut):

public class FilterDataController {

    public static final String DATE_FORMAT = \"y         


        
3条回答
  •  执念已碎
    2021-01-15 09:34

    If you really want a pure unit test not an integration test, you could rely on the annotation @Mock to mock your service FilterDataProvider and @InjectMocks to inject your mock into your instance of FilterDataController.

    Then you could propose 3 tests:

    1. One test where the dates are corrects but different,
    2. Another one where the dates are corrects but equal
    3. And the last one where the dates are incorrect which will thrown a ValueNotAllowedException that could be tested out of the box using @Test(expected = ValueNotAllowedException.class).

    If you need to make sure that filterDataProvider.getPossibleCountries(startDate, newEndDate) has been called with the expected arguments you need to use verify.

    The code would then be something like that:

    @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 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 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
        }
    }
    
        

    提交回复
    热议问题