java两种类型的spring测试的优缺点是什么
在我目前的项目中,我们正在开发微服务(web应用)。 在单元测试中,我们试图覆盖85-90%的代码。我注意到了使用spring进行测试的两种方法:
- 注入控制器并直接调用其方法
- 形成一个适当的请求,您可以在其中指定cookie、头。。。然后打个电话
此外,我们无法使用1方法测试身份验证
明年春天应该使用哪种测试方法?每种类型的优点是什么
{pr 1}$ 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
}
}
# 1 楼答案
据我所知,你需要了解什么时候模拟服务,什么时候直接打电话
在第一种方法中,您直接调用web服务,比如说,您有一个庞大的代码库,同时有多个开发人员在工作,这样您可以在类中获得不断的更新,如果您想要测试您的代码片段(这就是您使用JUnit的原因),那么直接调用可能会导致错误/测试失败因为有人可能改变了什么
在第二种方法中,模拟基本上消除了这种可能性,方法是模拟代码需要的其他服务,从而使代码测试更容易
但有些人会质疑,当你甚至没有测试到某一点的全部内容时,模拟有什么用,但模拟的主要原因是只测试你的代码片段,而不考虑代码所依赖的其他服务。此外,如果您谈到进行实际的服务调用,那么这应该是集成测试或端到端测试的一部分