简单的POCO领域对象应编写哪些单元测试?

5

因此,标准的敏捷开发理念建议将您的领域类设计成简单的POCO,并通过数据访问对象(例如NHibernate)使用单独的代理层进行持久化。它还建议尽可能高地覆盖单元测试。

对于这些简单的POCO对象编写测试有意义吗?比如我有一个看起来像这样的类:

public class Container {
 public int ContainerId { get; set;}
 public string Name { get; set;}
 public IList<Item> Contents { get; set;}
}

我可以为此编写哪些有用的单元测试?


我发现有一个有用的方法是测试你的 Pocos 不以任何方式改变数据。例如,OpenPojo 就是一个能够做到这一点的 Java 库。 - nullsteph
5个回答

16

通常像这样的值对象不需要拥有自己的测试。你可以从使用它实际执行某些操作的类中获取覆盖率。

单元测试旨在测试行为。没有行为?就没有必要进行测试。


我认为我们都同意这一点。但是当代码通过“分析器”运行时,它会说您只有例如80%的覆盖率,而最后20%是一堆POCO。祝你好运向管理层解释这个问题。 - Captain Kenpachi
正如Jeffrey所说,“你将从使用它来实际执行某些操作的类中获得覆盖率。” - bernhof
1
此外,向管理层解释这些指标非常容易 - 这些指标是开发工具,而不是管理工具,它们对于管理层来说与代码行数或审查依赖树一样相关。 - George Mauer

7
实际上,我认为如果您在编写类之前为此代码编写测试,那么您的实现将会有所不同。例如,您可能最终会编写一个构造函数来初始化集合,以便您可以引用它而无需每次都检查是否为空。我认为即使您认为不需要测试,编写测试也是一个好习惯。通常,在编写测试时,您会发现有很多假设并没有在第一次尝试编码时得到解决。
例如,ContainerId能否小于零?尝试将其设置为负值是否会导致错误?集合是否应由构造函数初始化,即使用此容器类的类是否必须在访问之前检查null,还是您希望保证集合永远不会为null,尽管它可能为空?
话虽如此,我通常会对过程进行一些合理性检查。例如,如果我知道构造函数是内部作用域的,并且只有工厂类创建对象。我将测试工厂方法以确保它们始终生成合法对象,但不一定测试容器类本身。
我想对我来说,关键是假设类需要测试,尝试编写它们,并仅在无法想到有意义的测试时省略它们。

3

这只是我的习惯,并不代表我是测试的终极标准。但在编写测试之前,我通常会先编写一个实际完成某些任务(例如设置默认值)的构造函数。

你需要测试自己编写的代码,而非语言本身。每当你新建一个 Container() 对象时,你都能得到一个全新的 Container。如果你在这一步出了问题,编译器会提示错误。


1

我喜欢把单元测试看作是“呼叫”意图单元。

你的代码表达的唯一意图是获取器和设置器;作为语言的一部分,我们假设它们有效。

没有其他意图被表达,因此不需要测试。

然而,我建议从Contents属性中删除设置器。集合属性应该是只读的。


以前从未听说过,但很有道理。 - George Mauer

0
我认为这甚至不是一个对象——对象是由其行为定义的,而这个类没有任何行为。它是一个纯数据容器。拥有这些是可以的,它们通常不需要任何测试,但要注意不要最终得到贫血领域模型。使用测试驱动开发会“强制”您首先考虑类的行为,并可能是一个很好的练习。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接