public List<Locatins> fetchLocations() {
BasicAuthRestTemplate restTemplate = new BasicAuthRestTemplate(config.getUsername(),config.getPassword());
String locationsOData = restTemplate.getForObject(config.getOdataUrl()+config.getLocations(), String.class);
String results = StringUtility.changeUIFieldCase(locations);
return map.Locations(results);
}
@Test
public void fetchLocationsTest() throws Exception {�
List<Locations> li = new ArrayList<>();
String locationData = "noting";
when(config.getUsername()).thenReturn(“test1”);
when(config.getPassword()).thenReturn("test12”);
when(config.getTdsOdataUrl()).thenReturn("https://localhost:8080");
when(config.getLocations()).thenReturn("/locations");
PowerMockito.mockStatic(BasicAuthRestTemplate.class);
PowerMockito.whenNew(BasicAuthRestTemplate.class).withArguments(config.getUsername(), config.getPassword()).thenReturn(restTemplate);
PowerMockito.when(restTemplate.getForObject("https://localhost:8080/locations",String.class)).thenReturn(locationData);
�
}
像这样的代码的典型问题是你把它和它的依赖关系(BasicAuthRestTemplate
)强耦合在一起:
BasicAuthRestTemplate restTemplate = new BasicAuthRestTemplate(config.getUsername(),config.getPassword());
此代码将始终使用此 restTemplate,而不是其他任何内容。您非常严格地将两个软件绑定在一起。这意味着您 a) 不能简单地在其他情况下使用您的代码(例如,如果您获得另一个不使用基本身份验证的 REST 服务,则必须更改此代码)和 b) 它可能很难测试,因为从字面上看,这段代码唯一能做的就是通过基本身份验证连接到某些东西。
Powermock和类似的工具几乎总是指出代码气味。如果您需要非常复杂和复杂的工具来测试您的代码,则代码很可能是坏的。
因此,如果可能的话,我建议通过注入 RestTemplate 来重构您的代码:
public List<Locatins> fetchLocations(RestTemplate restTemplate) {
String locationsOData = restTemplate.getForObject(config.getOdataUrl()+config.getLocations(), String.class);
String results = StringUtility.changeUIFieldCase(locations);
return map.Locations(results);
}
这将是最简单的方法,但当然你也可以通过 Spring (@Autowired
等)将其注入到类中。重要的一点是,通过将依赖项注入到代码中而不是"硬连线"来将依赖项与代码分开。
使用上面的代码,您可以更简单地测试它...
RestTemplate template = mock(BasicAuthRestTemplate.class);
Mockito.when(template...).thenReturn(...);
List<Locations> result = fetchLocations(template);
assertThat(result)....
当然,如果你不能重构代码,那么你可能会有点搞砸,需要复杂的工具(通过字节码操作可能是可能的,但老实说,这不是我想要做的)。