【问题标题】:Is it necessary to cover POJO by tests according to TDD? [closed]是否有必要根据TDD通过测试覆盖POJO? [关闭]
【发布时间】:2019-10-01 13:49:03
【问题描述】:

我目前正在阅读 Bob 叔叔的书,试图在我的职业生涯中拥抱 TDD。目前我怀疑是否有必要编写这样的测试:

public class Person {
    private String firstName;
    private String middleName;
    private String lastName;

    /*getters and setters*/
}

@Test
public void testPersonCreation() {
    Person person = new Person();

    person.setFirstName("Robert");
    person.setMiddleName("Cecil");
    person.setLastName("Martin");

    Assertions.assertThat(person.getFirstName()).isEqualTo("Robert");
    Assertions.assertThat(person.getMiddleName()).isEqualTo("Cecil");
    Assertions.assertThat(person.getLastName()).isEqualTo("Martin");
}

这种方法的优缺点是什么?

【问题讨论】:

  • 测试 getter 和 setter 是个好主意。如果您按小时计酬,而没有人关注您花费的时间。
  • @T.J.克劳德,我已经编辑了帖子以使其更具体
  • @Kayaman,目前,我倾向于相同的意见
  • 如果您涵盖其他代码(存储库、控制器、服务等),则应包括大部分或所有 pojo 方法。使用代码覆盖率工具来验证所覆盖的内容。
  • 冒着陈述显而易见的风险(因此发表评论,似乎不值得回答): 优点:* 确保编写 Person 以首先正确实现其 POJO 联系(例如,setter 真正设置了各自的私有字段,getter 真正获得了各自的私有字段)。 * 确保如果 Person 在未来某个时间点被修改,以至于它的基本 POJO 合同被破坏,你的测试开始失败。缺点:* 更多测试。

标签: java unit-testing tdd


【解决方案1】:

是否需要按照TDD通过测试覆盖POJO?

Test Driven Development by Example 中,Kent Beck 写道,TDD 由两个规则定义

  • 除非您首先有一个失败的自动化测试,否则不要编写一行新代码。
  • 消除重复。

如果您接受 Kent Beck 大约 2002 年的著作是权威的,那么是的 - 您必须在编写一行新 POJO 之前编写一个自动化测试。

2008年,an expert wrote

我是通过有效的代码而不是测试获得报酬,所以我的理念是尽可能少地测试以达到给定的信心水平

我的解释是,如果您不从自动化测试开始,它就不是 TDD ——但 TDD 并不是适用于所有情况的正确工具。

课程用马。

【讨论】:

    【解决方案2】:

    首先,在编写测试时使用代码覆盖工具来验证覆盖了什么。

    当您为使用 pojo 的代码编写测试时,也应该涵盖 pojo getter 和 setter。这比只使用 pojos 的测试更有价值,因为它表明 pojos 在应用程序代码的上下文中起作用。

    如果我向 pojo 添加 getter 和 setter 之外的方法,我会为这些添加测试。但我尽量避免对 getter 和 setter 进行测试。

    对此有一些测试框架(请参阅this question),它们也可用于检查等号和哈希码。

    【讨论】:

    • 谢谢您,感谢您在本主题中的所有 cmet,您能否稍微编辑您的答案以使其与有关利弊的问题相关,我可以将其标记为正确答案?
    【解决方案3】:

    如果您使用自动生成的 getter 和 setter 框架,如 Lombok,则无需对其进行测试

    @Getter
    @Setter
    public class Person {
    

    【讨论】:

    • 感谢您的回答,我稍微编辑了我的问题以使其更加具体。无论如何,如果您不能使用 Lombok 之类的东西,这种方法的优缺点是什么?
    • 你的意思是“代码覆盖工具不会抱怨它”吗?因为 Lombok 只带来了 IDEA 的自动生成 getter/setter。这不是龙目岛的特色。
    • lombok 在创建可能不使用的构造函数时会导致代码覆盖问题。如果您想要为您生成构建器,那么它需要全参数构造器。代码覆盖工具仍然会抱怨生成的代码。生成代码的最大好处是你知道不会有任何奇怪的东西,就像你在手写代码中发现的那样,这样可以减少测试的问题。
    • @nathanhughes 更新为使用 @Getter @Setter ehich 不创建构造函数
    • @Kayaman 我的意思是不需要 tedt 自动生成的设置器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 2014-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多