标签: assertj

是否可以使用FieldByFieldElementComparator从assertJ中排除某些字段?

如何实现以下目标:

List<Data> streams = new ArrayList<>();
assertThat(streams).usingFieldByFieldElementComparatorIgnoringGivenFields("createdOn").containsOnly(data1, data2);
Run Code Online (Sandbox Code Playgroud)

java assertions assertj

4
推荐指数
1
解决办法
1729
查看次数

如何在assertj中验证元素是其中之一

我找不到如何使用 assertj 检查以下内容(这很常见):

假设我有:

 result1 = {"AAA", "BBB"}
 result2 = {"DDD"}
Run Code Online (Sandbox Code Playgroud)

我想检查结果中的值是以下之一:

String[] valid = String[]{"AAA", "BBB", "CCC"};
Run Code Online (Sandbox Code Playgroud)

使用assertj,应该是这样的:

assertThat(result1).xxxx(valid);
assertThat(result2).xxxx(valid);
Run Code Online (Sandbox Code Playgroud)

这样 result1 会通过检查,但 result2 不会。

contains() 不起作用(它检查结果是否包含所有有效元素)

我不想为这种检查创建自定义条件

任何想法?

assertj

3
推荐指数
1
解决办法
1527
查看次数

AssertJ:如何使用compareTo和extracting()来断言BigDecimals

我将 AssertJextracting()方法与 Java8 lambda 一起使用,并将一些字段映射到 BigDecimal,然后断言结果数组。但我需要使用 BigDecimalcompareTo()和不使用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
  );
Run Code Online (Sandbox Code Playgroud)

编辑:我正在寻找一种流畅的方法来执行此操作,因为我当然可以将其拆分为多个不同的断言并以这种方式进行比较,或者将所有内容放入一个巨大的Condition.

java assertj

3
推荐指数
1
解决办法
5642
查看次数

使用 AssertJ 或 JUnit 断言身份

编辑二

基本上,问题是关于是否有 AssertJ(首选)或 JUnit 断言:

objA == objB
Run Code Online (Sandbox Code Playgroud)

编辑我

我的测试类 (CUT)扩展了 JAXB 的XmlAdapter. 在解组 XML 文件时,它应该保证相同的对象只存在一次。为了验证这一点,我的测试目前看起来像这样(在示例中,标准 ctor 创建了相等的对象):

MyType obj = cut.unmarshal(new MyType());
assertThat(cut.unmarshal(new MyType()) == obj).isTrue();
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 AssertJ 或 JUnit 显式声明身份?

原帖

我的被测类 (CUT)有一个方法(例如foo),它应该保证返回的对象——相等——只存在一次。目前,我正在使用以下断言语句:

assertThat(cut.foo() == obj).isTrue();
Run Code Online (Sandbox Code Playgroud)

有没有办法使用 AssertJ 或 JUnit 显式声明身份?

java junit assertj

3
推荐指数
1
解决办法
1173
查看次数

AssertThat 在日期比较中的用法

我想针对日期搜索编写一个测试。我正在考虑类似的测试代码

assertThat(repository.findByBookingDateAfter(LocalDate.of(2016, 1, 1))).extracting("bookingDate").are(...));
Run Code Online (Sandbox Code Playgroud)

其中类结构如下所示:

public class Booking{
  ...
  LocalDate bookingDate;
  ...
}
Run Code Online (Sandbox Code Playgroud)

因为查询是针对给定日期之后的任何预订,所以我的测试将检查该字段确实晚于该日期。经过一番网上搜索,我没有看到任何有用的信息。我想知道我是否走在正确的道路上。

有什么建议么?

更新:

后来,我在 build.gradle 文件中更改了依赖项设置,如下所示:

testCompile('org.springframework.boot:spring-boot-starter-test'){
    exclude group: 'org.assertj'
}
testCompile group: 'org.assertj', name: 'assertj-core', version: '3.6.2'
Run Code Online (Sandbox Code Playgroud)

拥有最新版本的assertj。

更新2:

以下是所有以“is”开头的方法的屏幕截图。“isAfter”不在列表中。

在此输入图像描述

java assertj

3
推荐指数
1
解决办法
4890
查看次数

对集合的所有元素断言相同的条件

我正在使用 AssertJ,我需要检查列表中的所有对象是否具有intField > 0. 像这样的东西:

assertThat(myObjectList).extracting(p -> p.getIntField()).isGreaterThan(0);
Run Code Online (Sandbox Code Playgroud)

实现这一目标的正确方法是什么?我应该使用其他图书馆吗?

java unit-testing assertj

3
推荐指数
1
解决办法
1657
查看次数

AssertJ 将提取的字段转换为 Map

我有一个MessageMessageHeaders字段的对象。本MessageHeaders类实现了Map<String, Object>。我想断言我设置了特定的标头。我很难找到MapAssert方法。

这是我想要完成的:

assertThat(actual)
  .extracting(Message::getHeaders) // This returns AbstractObjectAssert though
  .containsKeys("some key");  // Not available 
Run Code Online (Sandbox Code Playgroud)

这是要明确的MessageandMessageHeaders类:

public class Message {
  private MessageHeaders headers;
  // getter
}


public class MessageHeaders implements Map<String, Object>, Serializable {
  // methods
}
Run Code Online (Sandbox Code Playgroud)

java assertj

3
推荐指数
2
解决办法
2128
查看次数

匹配自定义异常

Javadoc给出了该方法的示例matches

assertThat(player).matches(p -> p.isRookie());
Run Code Online (Sandbox Code Playgroud)

事实上,当我定义一个虚拟类 Player 时,上面的语句编译正常。但是,当我定义一个从 Exception 派生的类时,以下内容不会编译:

public class MyCustomException extends Exception {
    public boolean isMyCustomFieldSet() { return true; }
}
...
MyCustomException myCustomException = new MyCustomExcpetion();
assertThat(myCustomException).matches(e -> e.isMyCustomFieldSet());
Run Code Online (Sandbox Code Playgroud)

我可以通过使用强制转换来编译它:

assertThat(myCustomException).matches(e -> ((MyCustomException)e).isMyCustomFieldSet());
Run Code Online (Sandbox Code Playgroud)

但这个演员看起来“丑陋”,而且有点为了解决某种缺陷而进行了修改。我可以让它以“更好”的方式编译,即不使用强制转换吗?

java assertj

3
推荐指数
1
解决办法
734
查看次数

如何使用 AssertJ 递归比较具有不同字段名称但相同值的两个对象

我想使用 AssertJ 的递归比较来比较两个对象(DTO 和实体),以便对 DTO->Entity 映射器进行单元测试。这两个对象都具有值几乎相同的字段,但是这两个对象之间的某些字段具有不同的名称。这会导致以下错误:

DTO can't be compared to Entity as Entity does not declare all DTO fields, it lacks these: [dtoFieldA, dtoFieldB, dtoFieldC]
Run Code Online (Sandbox Code Playgroud)

我尝试过以下配置,但没有运气:

 assertThat(DTO)
    .usingRecursiveComparison(RecursiveComparisonConfiguration.builder()
    .withEqualsForFields(fieldAPRedicate, "dtoFieldA")
    .withEqualsForFields(fieldBPRedicate, "dtoFieldB")
    .withEqualsForFields(fieldCPRedicate, "dtoFieldC")
    .build())
.isEqualTo(Entity)

BiPredicate<DTO, Entity> fieldAPRedicate = (d, e) -> d.dtoFieldA().equals(e.entityFieldA());
BiPredicate<DTO, Entity> fieldBPRedicate = (d, e) -> d.dtoFieldB().equals(e.entityFieldB());
BiPredicate<DTO, Entity> fieldCPRedicate = (d, e) -> d.dtoFieldC().equals(e.entityFieldC());
Run Code Online (Sandbox Code Playgroud)

比较类:

数据传输对象:

public class DTO {
   protected String sameNameField1;
   protected String sameNameField2;
   protected String dtoFieldA;
   protected String dtoFieldB;
   protected …
Run Code Online (Sandbox Code Playgroud)

java assertj junit5

3
推荐指数
1
解决办法
3219
查看次数

AssertJ:使用方法assertThatThrownBy时如何返回实际异常

我正在从 JUnit 5 和 Hamcrest Assertions 迁移到 AssertJ,但我无法找出从可执行文件中提取实际异常的正确方法。这是一个 JUnit/Hamcrest 示例:

var result = assertThrows(MyException.class, () -> this.objectUnderTest.someMethod(param1, param2, param3));
assertThat(result.getError().getErrorCode(), equalTo(someValue));
assertThat(result.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

我想要的是某物。像(断言J)

var result = assertThatThrownBy(() -> this.objectUnderTest.someMethod(param1, param2, param3))
 .isInstanceOf(MyException.class);
assertThat(result.getError().getErrorCode(), equalTo(someValue));
assertThat(result.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

但从 AssertJ 版本开始,3.21.0assertThatThrownBy方法为我提供了一个AbstractThrowableAssert<?, ? extends Throwable>类的实例,但我找不到任何可以为我提供该MyException实例的方法。所以现在我最终使用了另一种方法并手动转换为MyException

Throwable throwable = Assertions.catchThrowable(() -> this.objectUnderTest.doFilterInternal(param1, param2, param3));
MyException exception = (MyException) throwable;
assertThat(exception.getError().getErrorCode(), equalTo(someValue));
assertThat(exception.getError().getDescription(), equalTo("someString"));
Run Code Online (Sandbox Code Playgroud)

java assertj junit5

3
推荐指数
1
解决办法
1546
查看次数

标签 统计

assertj ×10

java ×9

junit5 ×2

assertions ×1

junit ×1

unit-testing ×1