如何实现以下目标:
List<Data> streams = new ArrayList<>();
assertThat(streams).usingFieldByFieldElementComparatorIgnoringGivenFields("createdOn").containsOnly(data1, data2);
Run Code Online (Sandbox Code Playgroud) 我找不到如何使用 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() 不起作用(它检查结果是否包含所有有效元素)
我不想为这种检查创建自定义条件
任何想法?
我将 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.
基本上,问题是关于是否有 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 显式声明身份?
我想针对日期搜索编写一个测试。我正在考虑类似的测试代码
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”不在列表中。
我正在使用 AssertJ,我需要检查列表中的所有对象是否具有intField > 0. 像这样的东西:
assertThat(myObjectList).extracting(p -> p.getIntField()).isGreaterThan(0);
Run Code Online (Sandbox Code Playgroud)
实现这一目标的正确方法是什么?我应该使用其他图书馆吗?
我有一个Message带MessageHeaders字段的对象。本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) 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)
但这个演员看起来“丑陋”,而且有点为了解决某种缺陷而进行了修改。我可以让它以“更好”的方式编译,即不使用强制转换吗?
我想使用 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) 我正在从 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.0该assertThatThrownBy方法为我提供了一个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)