spring mvc 中的单元测试

Unit testing in spring mvc

如果我想在 spring 中对我的 dao 类 进行单元测试,我会直接调用我的服务方法并对其进行测试,还是您会将服务方法与实际的 dao 方法分开测试?

另外我应该模拟 dao 调用还是实际使用像 H2 这样的内存数据库?我认为这更像是一个集成测试,尽管有些教程会这样做,或者标准方法是使用模拟数据库对象进行服务测试并在测试 dao 调用时使用 H2?

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

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

测试来自 Web 应用程序的剩余调用实际上取决于 API 应用程序的剩余方法如何响应,所以这是否值得单独测试?

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

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

正在尝试按提问顺序回答您的问题...

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

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

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

H2 和 MySQL 显然不一样,并且不共享所有相同的功能,所以你不能 100% 肯定地说 H2 测试会通过 MySQL ,但如果您只是测试标准的 CRUD 操作,它应该可以解决问题。