如何使用 Junit 和 Mockito 测试方法调用和可选的 switch case

How to test switch case with method call and optional using Junit and Mockto

我必须测试 DataIdResolver class,它是一个 class,里面有 switch caseoptionalswitch casecasedefault 部分也包含每个方法调用。我需要测试它,但我不确定该怎么做。

public class DataIdResolver {
    
        final DataService dataService;
    
        public DataIdResolver(DataService dataService) {
            this.dataService = dataService;
        }
    
        public List<String> fetchDataIds(String dataId){
            Optional<DataResponse> optionalResponse = dataService.getData(dataId);
            if(optionalResponse.isPresent()) {
                switch(optionalResponse.get().author){
                    case "Harry Potter":
                        return resolveAuthorDataIdAndSiblingsAuthorDataId(optionalResponse.get());
                    default:
                        return resolveServerSideDataIdAndSiblingsServerSideDataId(optionalResponse.get());
                }
            } else {
                return List.of(dataId);
            }
        }
    
        private List<String> resolveAuthorDataIdAndSiblingsAuthorDataId(DataResponse response) {
            
            List<String> resolvedServerSideIds = new ArrayList<>();
            resolvedServerSideIds.add(response.serverSideDataId);
            if (!response.siblings.isEmpty()){
                for (SiblingsDataResponse s : response.siblings) {
                    resolvedServerSideIds.add(s.dataId);
                }
            }
            return resolvedServerSideIds;
        }  
    
    }

这是我要开始的内容:

public class DataIdResolverTest {

    DataService dataService = Mockito.mock(DataService.class);
    RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
    private final HttpDataService httpDataService = new HttpDataService(restTemplate);


    @Test
    public void fetchDataIds() {
        Optional<DataResponse> optionalResponse = dataService.getData(dataId);
        optionalResponse.ifPresent(dataResponse -> Mockito
                .when(!dataResponse.siblings.isEmpty()).thenReturn(Boolean.valueOf("siblingsDataId")));
        httpDataService.getData("dataIdTest");
    }

    @Test
    public void resolveAuthorDataIdAndSiblingsAuthorDataId(){

    }
}

我应该用一种测试方法测试所有的东西吗? 最好的方法是什么?

感谢任何建议。

举个例子。

public class DataIdResolverTest {

    DataService dataService = Mockito.mock(DataService.class);
    private final DataIdResolver dataIdResolver = new DataIdResolver(dataService);


    @Test
    public void fetchDataIds_returnsListWithExceptedString_whenOptionalIsPresent() {
        //given
        ResponseData responseData = createYourResponseDataHere();
        Mockito.when(dataService.getData()).thenReturn(Optional.of(responseData));

        //when
        List<String> dataIds = dataIdResolver.fetchDataIds();

        //then
        //here you need to check if your dataIds have expected values, you can use Assertions
        //example
        Assert.assertEquals("expectedString", dataIds.get(0));
    }

    @Test
    public void fetchDataIds_returnsEmptyList_whenOptionalIsNotPresent() {
        //given
        ResponseData responseData = createYourResponseDataHere();
        Mockito.when(dataService.getData()).thenReturn(Optional.empty());

        //when
        List<String> dataIds = dataIdResolver.fetchDataIds();

        //then
        Assert.assertTrue(dataIds.isEmpty());
    }
}

总的来说,阅读更多关于单元测试的内容。您想要测试 class DataIdResolver 但您甚至没有创建它的实例。你不能在没有反射的情况下测试私有方法,一般来说这样做是不好的做法。还要记得更好地命名你的测试方法,你可以在这里阅读 https://dzone.com/articles/7-popular-unit-test-naming