当前位置: 首页 > 知识库问答 >
问题:

AssertJ:如何使用compareTo和Extraction()断言大小数

何正德
2023-03-14

我正在对Java8 lambdas使用AssertJextracting()方法,并将一些字段映射到BigDecimal,然后断言生成的数组。但是我需要使用compareTo()来比较BigDecimal,而不是使用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
  );

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


共有3个答案

姜德容
2023-03-14

如果是一次性断言,我将使用匹配项

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

如果您计划重用断言,我会按照@Fabienbk的建议创建一个条件。

海翔宇
2023-03-14

如果@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;
        }
    };
}
梅庆
2023-03-14

您可以使用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"));
 类似资料:
  • 我试着 我在调试时获得和是。 如何在使用时断言大于条件

  • 使用Hamcrest可以很容易地否定匹配器。例如。您可以这样编写断言:

  • 基本上,问题是是否有AssertJ(首选)或JUnit断言: 我的测试类(CUT)扩展了JAXB的。解组XML文件时,它应该保证相等的对象恰好存在一次。为了验证这一点,我的测试当前看起来是这样的(在示例中,标准ctor创建相等对象):

  • 我有两门课: 还有我的测试: 我希望它能通过,因为解包装可选,将转换为,在最后一个方法中,我只是比较字符串。 但它在最后一行失败了: 我不知道为什么可选包装没有打开

  • null 编辑:一个附加的非功能性需求是,测试应该可以很容易地通过附加的约束来扩展。在Hamcrest中,表达附加约束是相当容易的,例如。 依赖于列表索引的测试必须重新编号。在本例中,使用自定义条件的测试必须重写完整的条件(请注意,中的约束不限于子字符串检查)。

  • 我正在阅读使用Assertj验证结果的测试类。偶尔,我会发现一个没有断言的断言。 是否有可能在开发周期的某个地方识别这些类?我的第一个猜测是使用自定义声纳规则。虽然我不明白应该如何定义这个方法后面应该跟一个断言(返回void的方法?)。