两种类型的弹簧测试的优缺点是什么

时间:2018-12-27 04:17:56

标签: java spring-boot junit microservices spring-test

在我当前的项目中,我们正在开发微服务(Web应用程序)。 在单元测试中,我们尝试覆盖我们代码的85-90%。我注意到使用spring进行测试的2种方法:

  • 注入控制器并直接调用其方法
  • 形成适当的请求,您可以在其中指定Cookie,标题...,然后拨打电话

此外,我们将无法使用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
    }
}

1 个答案:

答案 0 :(得分:0)

据我所知,您需要了解何时模拟该服务以及何时进行直接调用。

在您的第一种方法中,您直接调用Web服务,因此,例如,您有一个庞大的代码库,并且有多个开发人员同时工作,因此您将在类中获得不断的更新,并且如果要测试您的作品,代码(这就是为什么使用JUnit的原因),然后直接调用可能会导致错误/失败的测试用例,因为有人可能已经更改了某些内容。

在第二种方法中,模拟可以通过模拟代码需要的其他服务来基本上消除这种可能性,从而使您的代码测试更加容易。

但是有些人会质疑,即使您甚至没有测试整个事情,在某种程度上都是正确的,但模拟的用途是什么,但是模拟的主要原因是仅测试您的代码段,而与该代码的其他服务无关取决于。另外,如果您要进行实际的服务呼叫,那么这应该是集成测试或端对端测试的一部分。