春季mvc的单元测试

时间:2015-07-26 21:49:44

标签: spring unit-testing dao resttemplate

如果我想在春季对我的dao类进行单元测试,我会调用我的服务方法并测试它们,还是将服务方法分别测试到实际的dao方法?

我是否应该模拟dao调用或实际使用像H2这样的内存数据库?我看到更多的集成测试虽然有些教程会这样做,或者标准方法是使用模拟数据库对象进行服务测试测试,并在测试dao调用时使用H2?

最后..我的应用程序有一个rest API,它使用Spring rest模板从Web前端调用,因此只有API Web应用程序才能访问数据库。

我是否会使用模拟对象测试每个Web应用程序中的其余方法,然后在2个应用程序之间启动tomcat实例和集成测试?如果我使用tomcat并在应用程序之间运行集成测试会在API应用程序中连接数据库或模拟对象吗?

测试来自Web应用程序的其余调用实际上依赖于API应用程序的rest方法如何响应,所以这甚至值得单独测试吗?

我发现单元测试相当混乱,因为其中一些似乎几乎是集成测试。

如果你在内存中对H2运行集成测试,但实际上我会使用MySQL吗?

1 个答案:

答案 0 :(得分:2)

尝试按照要求的顺序回答您的问题......

对于单元测试DAO方法,您应该直接使用已知状态的数据库测试实际的DAO类。 H2非常适合这种情况,因为您可以在不为每个测试设置MySQL的情况下运行它。使用@Before注释的设置方法非常有用,可确保数据库以预期的方式响应。

对于单元测试服务类,您应该模拟DAO类,以便它们始终以预期的方式运行。如果将服务和DAO类与实际数据一起使用,则现在通过同时测试多个层来运行集成测试。两者都有其价值,但通常最好在集成测试之前进行单元测试,以确保每个组件都正常运行。

对于测试控制器也是如此,您应该对其进行单元测试并模拟服务类,然后使用模拟请求执行集成测试以测试请求/响应方案。同样,通过此测试设置,您现在可以同时测试多个层和类。这很棒,因为它可以让您很好地了解应用程序在现实中的运行方式,但对于隔离错误没有用。

H2和MySQL显然不一样,并且没有共享所有相同的功能,所以你不能100%确信H2测试会通过MySQL,但是如果你只是测试标准的CRUD操作,它应该做的伎俩。