4 回答
TA贡献1815条经验 获得超12个赞
您正在方法中创建一个新RestTemplate对象getfeature()。所以,嘲笑RestTemplate没有效果。要么将RestTemplate其作为方法中的参数getfeature(),要么将其作为Feature类中的构造函数参数。
然后从测试类中,您可以模拟 RestTemplate 并像下面这样传递它:
Feature feature= new Feature(mockRestTemplate);
feature.getfeature(url);
或者
Feature feature = new Feature();
feature.getfeature(mockRestTemplate, url);
您必须根据决定对要素类进行必要的更改。
这是运行代码示例:
主要类:
public class Feature {
public static String getFeature(String url, RestTemplate restTemplate) {
return restTemplate.postForObject(url, "", String.class);
}
}
测试类:
请注意模拟的方式RestTemplate,然后模拟响应。
public class FeatureTest {
@Test
public void testFeature() {
RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
Mockito.when(restTemplate.postForObject(Mockito.any(String.class),
Mockito.any(Object.class), Mockito.any(Class.class))).thenReturn("abc");
System.out.println(Feature.getFeature("http://abc", restTemplate));
}
}
运行代码示例也可以在github上找到
Feature.java和FeatureTest.java
TA贡献1864条经验 获得超6个赞
如何在 restTemplate 上进行 junit 测试?
我们测试它返回的内容。
目前你的实现本身什么都不做,它只是委托给 aRestTemplate并返回它的结果。
答案fiveelements描述了实现(以广泛接受的值作为参数):
@Test
public void testFeature() {
RestTemplate restTemplate = Mockito.mock(RestTemplate.class);
Mockito.when(restTemplate.postForObject(Mockito.any(String.class),
Mockito.any(Object.class), Mockito.any(Class.class))).thenReturn("abc");
System.out.println(Feature.getFeature("http://abc", restTemplate));
}
这并没有断言实际行为:URL 可能是错误的,发布的正文或响应可能是错误的等等......而这个测试永远不会检测到这一点。最后,这个实现中可能有非常重要的事情是错误的,我们无法检测到。这种考验的价值,实在是太弱了。
由于此方法本身不执行逻辑,因此它更适合于可以在实际行为中断言和捕获更多事物/问题的集成测试:
@Test
public void testFeature() {
String actualFeature = Feature.getFeature("http://...");
String expectedFeature = ...;
Assertions.assertEquals(expectedFeature, actualFeature);
}
TA贡献1868条经验 获得超4个赞
我认为您需要更改代码以使您的单元测试至少使用 Mockito 工作,或者您必须使用其他一些库(如 powermock)来模拟本地对象实例化。
1)创建一个构造函数,它接受 RestTemplate 作为参数来注入你的模拟。
或者
2) 创建一些 setter 方法来注入该 RestTemplate。
另一种方法是创建另一个可以传递 RestTemplate 的方法。
public String getStringAsJson(RestTemplate restTemplate, String url, String xml) {
return restTemplate.postForObject(url, xml, String.class);
}
然后在你的测试中:
RestTemplate mockRestTemplate = mock(RestTemplate.class);
when(restTemplate.postForObject(mockurl, mockUrl, mockXml)).thenReturn("Json");
feature.getStringAsJson(mockRestTemplate,mockUrl,mockXml);
TA贡献1860条经验 获得超8个赞
如果您使用PowerMockito,那么您可以执行以下操作:
Feature 类无需更改代码,如果 prj 中有 PowerMockito lib,则可以直接使用它
RestTemplate mockedRestTemplate = PowerMockito.mock(RestTemplate.class);
PowerMockito.whenNew(RestTemplate.class).withAnyArguments().thenReturn(mockedRestTemplate);
添加回答
举报