3

我正在使用extracting()带有 Java8 lambda 的 AssertJ 方法并将一些字段映射到 BigDecimal,然后断言结果数组。但我需要比较 BigDecimal 使用compareTo()而不是equals()(因为这个)。我怎样才能做到这一点?

例子:

Actual actual = performTest();

Assertions.assertThat(actual)
  .extracting(
    Actual::getName,   // returns String
    Actual::getValue  // returns BigDecimal
  )
  .containsExactly(
    "abc",                 // ok, String equals comparison
    new BigDecimal("1.1")  // NOT OK, equals comparison, but I need compareTo comparison
  );

编辑:我正在寻找一种流畅的方式来做到这一点,因为我当然可以将其拆分为多个不同的断言并以这种方式进行比较,或者将所有内容放在一个巨人Condition中。

4

3 回答 3

3

您可以像这样使用BigDecimalComparator

Actual actual = performTest();
Assertions.assertThat(actual)
.extracting(
  Actual::getName,   // returns String
  Actual::getValue  // returns BigDecimal
)
.usingComparatorForType(BigDecimalComparator.BIG_DECIMAL_COMPARATOR, BigDecimal.class)
.containsExactly("abc",  new BigDecimal("1.1"));
于 2021-04-26T14:55:38.160 回答
0

如果@assylias 的解决方案不起作用,您始终可以使用自定义条件。

 assertThat(new BigDecimal("1.1")).has(new Condition<BigDecimal>() {
        @Override
        public boolean matches(BigDecimal s) {
            return s.compareTo(new BigDecimal("1.1")) == 0;
        }
 });

将其包装在功能接口中以获得更好的语法。

编辑:在您的示例中使用元组提取器:

    assertThat(foo).extracting("name", "value").has(new Condition<Object[]>() {
        @Override
        public boolean matches(Object[] value) {
            return new BigDecimal("1.1").compareTo(value[1]);
        }
    });

没有元组提取器:

Assertions.assertThat(actual).has(actualValue("abc", new BigDecimal("1.1")));

// Hide this somewhere and import static :)

public static Condition<Actual> actualValue(String expectedName, BigDecimal expectedValue) {
    return new Condition<Actual>() {
        @Override
        public boolean matches(Actual value) {
            return expectedName.equals(value.getName()) && value.getValue().compareTo(expectedValue) == 0;
        }
    };
}
于 2016-09-01T12:26:34.320 回答
-1

matches如果它是一次性断言,我会使用:

assertThat(actual).matches(a -> a.getName().equals("abc") && p.getValue().compareTo(new BigDecimal("1.1")) == 0);

如果您打算重用断言,我会按照@fabienbk 的建议创建一个条件。

于 2016-09-02T16:00:38.810 回答