AssertJ:如何使用 compareTo 和 extracting() 断言 BigDecimals
AssertJ: how to assert BigDecimals using compareTo together with extracting()
我正在将 AssertJ extracting()
方法与 Java8 lambda 一起使用,并将一些字段映射到 BigDecimal,然后声明生成的数组。但是我需要使用 compareTo()
而不是 equals()
来比较 BigDecimal(因为 this)。我该怎么做?
示例:
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
.
如果@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;
}
};
}
如果是一次性断言,我会使用 matches
:
assertThat(actual).matches(a -> a.getName().equals("abc") && p.getValue().compareTo(new BigDecimal("1.1")) == 0);
如果您打算重用该断言,我会按照@fabienbk 的建议创建一个条件。
您可以使用 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"));
我正在将 AssertJ extracting()
方法与 Java8 lambda 一起使用,并将一些字段映射到 BigDecimal,然后声明生成的数组。但是我需要使用 compareTo()
而不是 equals()
来比较 BigDecimal(因为 this)。我该怎么做?
示例:
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
.
如果@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;
}
};
}
如果是一次性断言,我会使用 matches
:
assertThat(actual).matches(a -> a.getName().equals("abc") && p.getValue().compareTo(new BigDecimal("1.1")) == 0);
如果您打算重用该断言,我会按照@fabienbk 的建议创建一个条件。
您可以使用 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"));