如何使用 Junit 和 Mockito 测试方法调用和可选的 switch case
How to test switch case with method call and optional using Junit and Mockto
我必须测试 DataIdResolver
class,它是一个 class,里面有 switch case
和 optional
。 switch case
的 case
和 default
部分也包含每个方法调用。我需要测试它,但我不确定该怎么做。
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
我必须测试 DataIdResolver
class,它是一个 class,里面有 switch case
和 optional
。 switch case
的 case
和 default
部分也包含每个方法调用。我需要测试它,但我不确定该怎么做。
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