我有一个dao实现的测试用例 测试类代码 -
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
xyzDaoImpl.getXyzDetails方法实现使用RestTemplate调用后端。
当我的配置类代码包含 -
@Bean
public RestTemplate restTemplate(RestTemplateBuilder restTemplateBuilder) {
return restTemplateBuilder
.setConnectTimeout(timeout)
.build();
}
但如果我使用构建器创建其余模板来设置超时等,则测试失败 -
testException = java.lang.AssertionError: No further requests expected: HTTP POST http://... url.
尝试使用@Profile(“test”)默认和@Profile(“!test”)创建Bean - 自定义设置,仍然测试失败。
错误是 -
<plurals name="myplural">
<item quantity="one">only 1 <b>item</b></item>
<item quantity="other">%1$d <b>items</b></item>
</plurals>
答案 0 :(得分:0)
使用@RestClientTest
运行时,RestTemplate
返回的RestTemplateBuilder
不是真正的客户端。它们连接到虚假服务器(MockRestServiceServer
),需要使用预期请求及其相应的响应进行设置。
以前使用new RestTemplate()
的测试是与网络通信的实际客户端。
如果您希望RestTemplateBuilder
生成RestTemplate
与真实服务器通信,则可以取消@RestClientTest
。
如果您希望RestTemplateBuilder
生成与RestTemplate
对话的模拟MockRestServiceServer
,
@RestClientTest
MockRestServiceServer
RestTemplateBuilder
生成RestTemplate
,并发送上一步中配置的请求。如下:
@RunWith(SpringRunner.class)
@RestClientTest({XyzDaoImpl.class})
@TestPropertySource(locations = "classpath:application-test.properties")
public class XyzDaoTest {
@Autowired
private MockRestServiceServer server;
@Before
public void setUp() throws Exception {
this.server.expect(requestTo("/...url"))
.andRespond(withSuccess("{\"status\": \"ok\"}", MediaType.APPLICATION_JSON));
}
@Test
public void testGetXyzDetails(){
assertThat(xyzDaoImpl.getXyzDetails("123", null)).isNotNull();
}
}
class XYZDaoImpl {
@Autowired
RestTemplate client;
String getXyzDetails(String a, String b) {
return client.getForObject("/...url", String.class);
}
}