在我当前的项目中,我们正在开发微服务(Web应用程序)。 在单元测试中,我们尝试覆盖我们代码的85-90%。我注意到使用spring进行测试的2种方法:
此外,我们将无法使用1方法测试身份验证。
接下来的弹簧测试应采用哪些方法?每种类型的(缺点)有哪些优点?
@RestController
class MyController {
@PostMapping(path="/path")
public String handle(@RequestBody MyRequest request) {
//service invoked
return "some value";
}
}
JUnit方法#1
@RestController
class MyController {
@PostMapping(path="/path")
public String handle(@RequestBody MyRequest request) {
//service invoked
return "some value";
}
}
JUnit方法2
@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
}
}
答案 0 :(得分:0)
据我所知,您需要了解何时模拟该服务以及何时进行直接调用。
在您的第一种方法中,您直接调用Web服务,因此,例如,您有一个庞大的代码库,并且有多个开发人员同时工作,因此您将在类中获得不断的更新,并且如果要测试您的作品,代码(这就是为什么使用JUnit的原因),然后直接调用可能会导致错误/失败的测试用例,因为有人可能已经更改了某些内容。
在第二种方法中,模拟可以通过模拟代码需要的其他服务来基本上消除这种可能性,从而使您的代码测试更加容易。
但是有些人会质疑,即使您甚至没有测试整个事情,在某种程度上都是正确的,但模拟的用途是什么,但是模拟的主要原因是仅测试您的代码段,而与该代码的其他服务无关取决于。另外,如果您要进行实际的服务呼叫,那么这应该是集成测试或端对端测试的一部分。