在我的应用程序中,我有很多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)。
谢谢帮忙!
由于您使用的是Spring MVC for REST,因此我建议您使用通过实例化MockMVC()提供的测试工具—启用测试,例如:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {
... // any required Spring config
)
@WebAppConfiguration
public class RestControllerTest {
@Autowired
private WebApplicationContext context;
private MockMvc mockMvc;
@Before
public void setup() {
mockMvc = MockMvcBuilders.webAppContextSetup(context).build();
}
@Test
public void getUserList() throws Exception {
mockMvc.perform(get("/user"))
.andExpect(status().isOk())
.andExpect(content().contentType("application/json;charset=UTF-8"))
.andExpect(content().encoding("UTF-8"))
.andExpect(jsonPath("$", hasSize(8)))
.andExpect(jsonPath("$[0].id").exists())
.andExpect(jsonPath("$[0].alias").exists())
.andExpect(jsonPath("$[0].name").exists())
);
}
}
此单元测试将在不部署的情况下测试REST接口。具体来说,是否只返回8个用户,并且第一个用户具有“id”、“alias”和“name”字段。
jsonPath断言需要两个依赖项:
'com.jayway.jsonpath:json-path:0.8.1'
'com.jayway.jsonpath:json-path-assert:0.8.1'
也许还有:
'org.springframework:spring-test:4.1.7.RELEASE'
如果您不是在寻找端到端(integration)测试,MockRestServiceServer
可能会对您有所帮助。我发现将测试用例与实际服务分离非常有用。
Spring doc说:
用于涉及直接或间接使用RestTemplate的测试。提供了一种设置预期请求的方法,这些请求将通过RestTemplate执行,并提供模拟响应以发送回,从而消除了对实际服务器的需要。
这是官方文件
还有一个提示是,requestTo
不能自动导入
server.expect(manyTimes(), requestTo("/hotels/42")) ....
这是org的静态方法。springframework。测验网状物客户火柴MockRestRequestMatchers
文档中有一个关于这方面的好章节,我建议您通读它以充分了解您可以做什么。
我喜欢使用带有自定义配置的@IntegrationTest
,因为这样可以启动整个服务器,并让您测试整个系统。如果您想用mock替换系统的某些部分,可以通过排除某些配置或bean并用您自己的替换它们来实现。
这里有一个小例子。我忽略了MessageService
接口,因为从IndexController
中可以明显看出它的作用,并且它是默认实现-DefaultMessageService
-因为它不相关。
它所做的是,它旋转整个应用程序减去DefaultMessageService
,而是使用它自己的MessageService
。然后,它使用RestTemboard
向测试用例中正在运行的应用程序发出真正的HTTP请求。
应用程序类别:
emo.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();
}
}
测试类:
IntegrationTestDemost。爪哇:
@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);
}
}
TestConfig.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";
}
};
}
}
问题内容: 我想直接通过HTTP测试我的RESTful应用程序,我正在寻找可以帮助我完成该任务的工具。基本上,我正在寻找一个HTTP请求的简单包装,该请求可以提交例如HTML表单或序列化资源(如JSON或XML)。 如果有一种方法可以验证服务是否确实遵循REST体系结构准则(无状态,URI,内容协商等),那将是很好的。 能够与JUnit一起使用将是一个方便的好处。您是否知道任何可以帮助我完成我想做
我正在使用获取对象。但是当我在客户端运行Main时出现错误,请告诉我如何修复它??? 线程“main”org.springframework.http.converter.httpMessageNotreadableException:无法读取JSON:无法将edu.java.spring.service.user.model.user实例反序列化出START_ARRAY令牌[source:sun
问题内容: 我正在使用RestTemplate 方法将正文发布到端点。我需要使用Mockito为我的代码编写测试用例的帮助。返回类型为void,但是可以将其更改为,或者需要进行测试。我已经提到了许多其他文档,但是它们非常笼统,我尝试使用它们,但是由于and和return类型是不同的,所以大多数对我来说都不起作用。。任何建议表示赞赏。谢谢 这是我的Java课 问题答案: 您正在测试MyClass类中
如果需要从应用程序调用远程REST服务,可以使用Spring Framework的RestTemplate类。 由于RestTemplate实例在使用之前通常需要进行自定义,因此Spring Boot不提供任何单个自动配置的RestTemplate bean。 但是,它会自动配置RestTemplateBuilder,可用于在需要时创建RestTemplate实例。 自动配置的RestTempla
我RestClient应该使用来自多个服务器的服务,每个服务器具有不同的主机名和凭据。 我知道是线程安全的,并且为每个任务创建不同的连接,但是如何使用不同的凭据来完成呢?凭据不是在创建时提供给RestTemplate的吗?
问题内容: 谁能提供给我一个代码示例,以使用Spring Rest模板访问通过https保护的REST服务URL。 我有证书,用户名和密码。服务器端使用了基本身份验证,我想创建一个可以使用提供的证书,用户名和密码(如果需要)连接到该服务器的客户端。 问题答案: