春靴Dao测试

时间:2017-12-31 00:30:55

标签: spring testing spring-boot junit

我有一个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>

1 个答案:

答案 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);
    }
}