java - 每个案例一个单元或每个断言一个单元

标签 java unit-testing

在单元测试中,从支持成本的角度来看,我应该为每个案例编写一个单元还是每个断言编写一个单元?我有以下代码

void methodUnderTest(Resource resource) {
    if(!resource.hasValue()) {
        Value value = valueService.getValue(resource);
        resource.setValue(value);
    }

    // resource.setLastUpdateTime(new Date()); // will be added in future
    db.persist(resource);
    email.send(resource);
}

注释行将在不久的将来添加,我想更新单位会花费多少。

据我所知,有两种方法可以测试此代码。

  1. 编写 2 个传递有值和无值资源的单元。在这两个测试中,验证是否调用了 db.persist 和 email.send。添加 LastUpdateTime 后,我必须更新两个测试以验证属性是否已设置。

  2. 编写单独的单元测试:一个检查 db.persist 是否被调用,另一个检查 email.send,第三个和第四个检查是否有值的资源。添加 LastUpdateTime 后,我只需编写新单元。

我喜欢第二种方式,因为我喜欢这样的想法:我不必接触工作单元。但这可能会出现大量代码重复,因为实际上所有 4 个测试都执行相同的操作,只是使用不同的断言。

从“每个单元测试只有一个概念”的角度来看,第一种方法看起来更正确。但这样的测试不是很难维护吗?添加新的东西我总是不得不修改所有现有的测试,这听起来不太好。

这里有我应该遵循的最佳实践吗?

最佳答案

我建议您将所有测试的通用内容放入测试的 setUp() 中,每个单元测试只有一个断言,就像您的第二种测试方式一样。

当您添加新的代码行时,您只需使用一个断言再添加一个测试用例。

不修改现有测试,不重复代码。

关于java - 每个案例一个单元或每个断言一个单元,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26913194/

相关文章:

java - 自定义 Tomcat 错误页面不显示图像

c# - 从 .exe 获取 FileDescription (ProgramName)

unit-testing - 使用 Autofixture 的 CreateProxy 来使用 Likeness、SemanticComparison 功能时遇到问题

Ruby 单元测试 - 访问测试结果(成功/失败)?

javascript - Angular Testing Controller 导致 TypeError : Object #<Object> has no method '$watch'

java - 如果我已经完成向上转换,为什么要重写从子类调用的方法?

java - 有没有其他方法可以在不使用下面代码中的 Join 的情况下启用多线程

java - 我无法让此类通过按钮打开另一个类/xml

c# - RhinoMocks stub 具有简化的实现,尝试方法模式

java - 模拟在测试方法内创建的返回值(这是一个对象)