【问题标题】:assertThat field by field or compare objectassertThat 逐个字段或比较对象
【发布时间】:2021-06-30 15:51:07
【问题描述】:

我正在和我的朋友发生争执,我想知道你的意见。

在测试中,您认为逐个字段比较更好还是只创建一个 expectedResultObject 并进行比较。

例如:

Assert.That(obj.Foo).isEqualTo(FOO);
Assert.That(obj.Test).isEqualTo(TEST);

Foo expected = new Foo(FOO, TEST);
assertThat(obj).usingRecursiveComparison().isEqualTo(expected);

在这个例子中,我们只有两个字段,但我们可以分配更多。

谢谢

【问题讨论】:

  • 你确定 usingRecuriseComparison() 吗?如果你有一个 equals 方法,只有 assertThat(obj).isEqualTo(expected) 不起作用?
  • 嗨,你看到我的回答了吗?

标签: java junit hamcrest


【解决方案1】:

如果您可以有多个字段,则预期的方法会更好,因为您将在构造函数的参数中添加其他字段。想象一下,如果您有 100 个字段,按照您在第一个示例中的建议逐行添加它们会让人头疼,而添加参数会更简单一些。

【讨论】:

    【解决方案2】:

    在这两种可能性之间,我更喜欢没有 usingRecursiveComparison() 的一种。

    我想补充一点:

    1. 对象不是数据工具箱,因此添加 getter/setter 来测试对象的创建并不是一件好事。最好测试一种行为,一种可以测试回报的方法。
    2. 通常我不喜欢在测试中编写多个断言。

    有一种技术可以让断言更容易理解(使用 AssertJ,但我认为你可以使用 Hamcrest 来做这种事情)。

    初始类:

    public class Amount {
        private int value;
    
        public Integer add(int amountToAdd) {
            value += amountToAdd;
            
            return value;
        }
    }
    

    创建一个断言器:

    public class IntegerAsserter extends org.assertj.core.api.AbstractAssert<IntegerAsserter, Integer> {
        IntegerAsserter(Integer actual) {
            super(IntegerAsserter.class, actual);
        }
    
        public IntegerAsserter isBetweenOneOrTwo() {
            Assert.assertTrue(actual < 2);
            Assert.assertTrue(actual > 1);
    
            return this;
        }
    }
    

    创建一个新的断言:

    public class Assertions extends org.fest.assertions.Assertions {
        public static IntegerAsserter assertThat(Integer actual) {
            return new IntegerAsserter(actual);
        }
    }
    

    然后使用它:

    public void should_be_between_one_or_two {
        Amount amount = new Amount(0);
        
        Integer newAmount = amount.add(1);
    
        Assertions.assertThat(obj).isBetweenOneOrTwo();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 2016-10-23
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多