我可以以某种方式使用AssertJ来断言List只有一个(子)类的实例吗?
public class A {}
public class B extends A {}
public class C extends A {}
@Test
public void test() {
  List<A> list = new ArrayList<A>();
  list.add(new B());
  Assertions.assertThat(list).containsOnlyOnce(B.class);
}
有没有办法在使用AssertJ时再次抛出一个方法来检查原因中的消息是否等于某个字符串.
我目前正在做类似的事情:
assertThatThrownBy(() -> SUT.method())
            .isExactlyInstanceOf(IllegalStateException.class)
            .hasRootCauseExactlyInstanceOf(Exception.class);
并且想添加一个断言来检查根本原因中的消息.
假设我有一个Map<String, Action>,我会这样:
    assertThat( spyActionMap.get( "a" ) ).isInstanceOf( Action.class );
...通过。现在我想检查获得的Action是否正确:
    assertThat( spyActionMap.get( "a" ) ).isInstanceOf( Action.class ).getValue( Action.NAME ).isEqualTo( "Go crazy" );
...无法编译,这并不奇怪。有什么办法可以做到这种事情吗?
嗨,Java 大师和 AssertJ 大师,
我想问 AssertJ 中是否有一种方法可以验证对象列表中是否存在对象(例如ArrayList<TestObject> listOfTestObjects)。其中特定对象的字段(getter 方法的返回)值与模式或正则表达式模式匹配。
请参阅下面的示例了解更多详细信息:
class TestObject {
    private String stringValue;
    public String getValue() {
       return this.stringValue;
    }
    public void setValue(String newStringValue) {
        this.stringValue = newStringValue;
    }
}
ArrayList<TestObject> listOfTestObjects = new ArrayList<TestObject>();
// populate the list here...
assertThat(listOfTestObjects).extracting("value").containsAnElementWith("some regular expressions here...");
请注意,我并不期待“
...containsAnElementWith("some regular expressions here...");"
成为一个现有的方法(如果有的话,实际上会更好),但这可以是assertj或junit中的一个功能/方法,我可以用它来简化单元测试自动化,而不是循环其中一个进行一场比赛。
干杯
我想检查正在测试的集合是否包含以特定字符串结尾的任何元素。
对于 Hamcrest,它可能是这样的:
assertThat("Contains an element ending with 'xyz'", 
               myCollection, hasItems(endsWith("xyz")));
如何使用 AssertJ 做同样的事情?
class Person {
  private List<Phone> phones;
}
class Phone {
  private String number;
}
assertThat(result).usingRecursiveComparison()
        .ignoringCollectionOrder()
        .isEqualTo(expectedPerson);
具有expectedPerson相同数量的电话和电话号码,但测试失败,因为列表引用不同。如果我没记错的话,usingRecursiveComparison只会比较价值。那么为什么这里失败了呢?
如何在测试中根据字段值“深度”比较两个未实现 equals 方法的对象?
在我的示例中,我有来自两个不同版本的 XML 模式的两个对象,它们仅在版本上有所不同,在我的测试中,我想表明推土机映射的结果等于原始. 自动生成的类不实现 equals 方法。
my.new.schema.Element new = mapper.map(old, my.new.schema.Element.class);
assertEquals(old, new); //obviously doesn't work
我正在尝试为构造函数实现 lambda 表达式。我的构造函数可以抛出 IllegalArgumentException。我尝试了不同的方法。第一种方法是调用 lambda 表达式:
catchThrowable(() -> new SomeClass(testVar1, null, testVar2));
它工作得很好,我可以捕获异常然后解析它。当我尝试使用自己的界面时出现问题:
interface SomeClassFactory{
        SomeClass create (String testVar1, String persId, String testVar2) throws IllegalArgumentException;
}
SomeClassFactory factory = SomeClass::new;
然后我用它作为:
catchThrowable((ThrowableAssert.ThrowingCallable) factory.create(testVar1, null, testVar3));
但最后一行代码没有捕获任何异常,我的代码给出了运行时异常并停止。您能否解释一下为什么会发生这种情况,如果可能的话,如何解决?
给定 Java 中的以下字段:
private Instant createdDate = Instant.now();
对应Postgres中的以下字段:
created_date TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
并使用 Spring Data JDBC CrudRepository save(S实体)保存到数据库。
检查原始对象字段和保存的对象字段是否相等时:
assertThat(original_obj.getCreatedDate()).isEqualTo(database_obj.getCreatedDate());
我得到以下不匹配:
org.opentest4j.AssertionFailedError:
      expected: 2023-05-29T10:41:12.555839137Z
       but was: 2023-05-29T10:41:12.555839Z
看起来Instant从数据库加载的数字比原始 Instant 少了 3 位。
我怎样才能使两个时刻匹配?为什么它们不同?
AssertJ的assertThat(...).isEqualTo()方法比较.equals()默认使用。这通常是正确的选择,但有时您确实想通过精确的对象标识/引用标识进行比较(==Java 中的“双等于”,Kotlin 中的“三等于” ===)。
是否有一种惯用的方法来强制 AssertJ 进行这种比较,例如我不知道的断言方法?
我能做的最好的事情就是通过在没有 AssertJ 的情况下进行比较来解决这个问题,然后仅使用它来检查生成的布尔值:
科特林:
assertThat(obj1 === obj2).isTrue()
爪哇:
assertThat(obj1 == obj2).isTrue();
正如我已经暗示的那样,这并不理想,因为 a) 与其他断言相比,它看起来不一致,b) 当断言失败时产生的错误消息只是说“预期为真,结果为假”,这并不像显示的那么好所讨论的不同对象(即使它们仅在内存位置上有所不同,而不是其内容不同)。