unit-testing - 单元测试和集成测试示例

标签 unit-testing integration-testing database-testing

我在 Test 类中创建了以下四个测试,用于测试 CompanyService 的 findCompany() 方法。

@Test
public void findCompany_CompanyIdIsZero() {
    exception.expect(IllegalArgumentException.class);
    companyService.findCompany(0);
}
@Test
public void findCompany_CompanyIdIsNegative() {
    exception.expect(IllegalArgumentException.class);
    companyService.findCompany(-100);
}
@Test
public void findCompany_CompanyIdDoesntExistInDatabase() {
    Company storedCompany = companyService.findCompany(100000);
    assertNull(storedCompany1);
}

@Test
public void findCompany_CompanyIdExistsInDatabase() {
    Company company = new Company("FAL", "Falahaar");

    companyService.addCompany(company);

    Company storedCompany1 = companyService.findCompany(company.getId());
    assertNotNull(storedCompany1);
}

我的理解是前三个是单元测试。他们测试 findCompany() 方法的行为,检查该方法如何响应不同的输入。 第四个测试虽然放在同一个类中,但实际上对我来说似乎是一个集成测试。它需要先将公司添加到数据库中,以便以后可以找到它。这引入了外部依赖项 - addCompany() 和数据库。

我走得对吗?如果是,那么我应该如何进行单元测试来查找现有对象?只是 mock 该服务来“找到”一个?我认为这破坏了测试的目的。

非常感谢这里的任何指导。

最佳答案

我这样看:您在这里测试的“单元”是CompanyService。从这个意义上说,您的所有测试对我来说都看起来像单元测试。但是,在您的服务之下,可能还有另一个服务(您提到了数据库),该测试也在执行?这可能会开始模糊集成测试的界限,但你必须问自己这是否重要。您可以删除任何此类底层服务,并且您可能希望这样做,如果:

  1. 底层服务的设置或使用速度很慢,导致您的单元测试太慢。
  2. 您希望确保此测试的行为不受底层服务的影响 - 即,只有当 CompanyService 中存在错误时,此测试才会失败。

根据我的经验,只要底层服务足够快,我就不会太担心依赖它的单元测试。我不介意一些集成泄漏到我​​的单元测试中,因为它有好处(更多的集成覆盖率)并且很少引起问题。如果它确实引起了问题,您可以随时返回并添加 stub 以提高隔离性。

关于unit-testing - 单元测试和集成测试示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15067276/

相关文章:

unit-testing - 如何在 Play 框架中针对非内存数据库(如 MySQL)创建单元测试,并重置为已知状态?

java - 如何测试飞路迁移?

unit-testing - 如何使用 Moq 测试对 NServiceBus IBus.Publish() 的调用?

Java - 代码覆盖率

ruby-on-rails - 如果只更改注册 View ,我是否需要自定义设计 Controller ?

java - PageFactory.initElements 填充了哪些 WebElements?

android - 如何在 Android 中填充测试数据库?

c++ - 对不适合作为新类提取的私有(private)方法进行单元测试的好方法是什么?

unit-testing - 如何使用 asp.net 4.0 Web 表单进行 TDD/BDD?

selenium - 在 Webdriver.io 中调度 native DOM 事件