gpt4 book ai didi

java - 使用 RestTemplate 进行 RESTful 服务测试

转载 作者:搜寻专家 更新时间:2023-10-30 20:58:21 25 4
gpt4 key购买 nike

在我的应用程序中,我有很多 REST 服务。我已经为所有服务编写了测试:

org.springframework.web.client.RestTemplate

REST- 服务调用,例如看起来像这样:

final String loginResponse = restTemplate.exchange("http://localhost:8080/api/v1/xy", HttpMethod.POST, httpEntity, String.class)
.getBody();

然后我检查响应正文 - 一切正常。缺点是,必须启动应用程序才能调用 REST 服务。

我现在的问题是如何在我的 JUnit-@Test 方法中做到这一点?它是一个 Spring Boot 应用程序(带有嵌入式 tomcat)。

感谢您的帮助!

最佳答案

有一个很好的chapter关于文档中的这一点,我建议您通读它以充分理解您可以做什么。

我喜欢将 @IntegrationTest 与自定义配置一起使用,因为它会启动整个服务器并让您测试整个系统。如果您想用模拟替换系统的某些部分,您可以通过排除某些配置或 beans 并将它们替换为您自己的来实现。

这是一个小例子。我省略了 MessageService 接口(interface),因为从 IndexController 中可以明显看出它的作用,并且它是默认实现 - DefaultMessageService - 因为它不相关。

它所做的是启动整个应用程序,去掉 DefaultMessageService,而是使用它自己的 MessageService。然后它使用 RestTemplate 向测试用例中正在运行的应用程序发出真正的 HTTP 请求。

应用类:

IntegrationTestDemo.java:

@SpringBootApplication
public class IntegrationTestDemo {

public static void main(String[] args) {
SpringApplication.run(IntegrationTestDemo.class, args);
}

}

IndexController.java:

@RestController
public class IndexController {

@Autowired
MessageService messageService;

@RequestMapping("/")
String getMessage() {
return messageService.getMessage();
}
}

测试类:

IntegrationTestDemoTest.java:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = TestConfig.class)
@WebIntegrationTest // This will start the server on a random port
public class IntegrationTestDemoTest {

// This will hold the port number the server was started on
@Value("${local.server.port}")
int port;

final RestTemplate template = new RestTemplate();

@Test
public void testGetMessage() {
String message = template.getForObject("http://localhost:" + port + "/", String.class);

Assert.assertEquals("This is a test message", message);
}
}

测试配置.java:

@SpringBootApplication
@ComponentScan(
excludeFilters = {
// Exclude the default message service
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = DefaultMessageService.class),
// Exclude the default boot application or it's
// @ComponentScan will pull in the default message service
@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = IntegrationTestDemo.class)
}
)
public class TestConfig {

@Bean
// Define our own test message service
MessageService mockMessageService() {
return new MessageService() {
@Override
public String getMessage() {
return "This is a test message";
}
};
}
}

关于java - 使用 RestTemplate 进行 RESTful 服务测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31739939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com