簡體   English   中英

按字段或比較對象斷言該字段

[英]assertThat field by field or compare object

我正在和我的朋友爭論,我想知道你的意見。

在測試中,您認為是逐個字段比較還是僅創建一個 expectedResultObject 並進行比較更好。

例如:

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

對比

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

在這個例子中,我們只有兩個字段,但我們可以分配更多。

謝謝

如果您可以有多個字段,那么預期的方法會更好,因為您將在構造函數的參數中添加其他字段。 想象一下,如果您有 100 個字段,按照您在第一個示例中的建議逐行添加它們會令人頭疼,而添加參數會更簡單一些。

在這兩種可能性之間,我更喜歡沒有 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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM