【发布时间】:2019-05-25 03:59:46
【问题描述】:
在我目前的项目中,我们正在研究微服务(网络应用程序)。 在单元测试中,我们尝试覆盖 85-90% 的代码。我注意到使用 spring 进行测试的两种方法:
- 注入控制器并直接调用其方法
- 形成一个适当的请求,您可以在其中指定 cookie、标头...然后进行调用
此外,我们将无法使用 1 方法测试身份验证。
接下来应该使用哪些春季测试方式?每种类型的(缺点)优点是什么?
@RestController
class MyController {
@PostMapping(path="/path")
public String handle(@RequestBody MyRequest request) {
//service invoked
return "some value";
}
}
JUnit 方法 #1
@LotsOfAnnotations
class ControllerTest1 {
@Autowired
private MyController myController;
@Test
public String verboseNameTest() {
// Mock 3rd party calls
....
// Form request
MyRequest request = new MyRequest();
// Invoke testing method
myController.handle(request);
// Assert
}
}
JUnit 方法 #2
@LotsOfAnnotations
class ControllerTest2 {
@Autowired
private TestRestTemplate testTemplate;
private MockRestServiceServer server;
@Autowired
private MockMvc mockMvc;
@Autowired
private WebApplicationContext webAppContext;
@Before
public void setup() {
server = MockRestServiceServer.createServer(testTemplate.getRestTemplate());
mockMvc = MockMvcBuilders.webAppContextSetup(this.webAppContext).build();
}
@Test
public String verboseNameTest() {
// Mock 3rd party calls
....
// Form request
String jsonStringRequest = "{}";
RequestBuilder requestBuilder = MockMvcRequestBuilders
.post("/path")
.contentType(MediaType.APPLICATION_JSON)
.content(jsonStringRequest);
// Make a call
MvcResult result = this.mockMvc
.perform(requestBuilder)
.andExpect(status().isOk())
.andReturn();
// Assert
}
}
【问题讨论】:
-
对于我的项目,我们在服务层使用方法一,而在控制器测试中使用方法二。
标签: java spring-boot junit microservices spring-test