标签: assertj

Assert List仅包含使用AssertJ的类的一个实例

我可以以某种方式使用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);
}
Run Code Online (Sandbox Code Playgroud)

java unit-testing assertj

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

AssertJ在原因消息上断言

有没有办法在使用AssertJ时再次抛出一个方法来检查原因中的消息是否等于某个字符串.

我目前正在做类似的事情:

assertThatThrownBy(() -> SUT.method())
            .isExactlyInstanceOf(IllegalStateException.class)
            .hasRootCauseExactlyInstanceOf(Exception.class);
Run Code Online (Sandbox Code Playgroud)

并且想添加一个断言来检查根本原因中的消息.

java testing unit-testing assertj

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

AssertJ - 检查类后继续流畅的断言

假设我有一个Map<String, Action>,我会这样:

    assertThat( spyActionMap.get( "a" ) ).isInstanceOf( Action.class );
Run Code Online (Sandbox Code Playgroud)

...通过。现在我想检查获得的Action是否正确:

    assertThat( spyActionMap.get( "a" ) ).isInstanceOf( Action.class ).getValue( Action.NAME ).isEqualTo( "Go crazy" );
Run Code Online (Sandbox Code Playgroud)

...无法编译,这并不奇怪。有什么办法可以做到这种事情吗?

java fluent assertj

2
推荐指数
1
解决办法
2172
查看次数

AssertJ:一种检查对象字段值是否包含特定模式(正则表达式)的方法

嗨,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...");

Run Code Online (Sandbox Code Playgroud)

请注意,我并不期待“

...containsAnElementWith("some regular expressions here...");"
Run Code Online (Sandbox Code Playgroud)

成为一个现有的方法(如果有的话,实际上会更好),但这可以是assertj或junit中的一个功能/方法,我可以用它来简化单元测试自动化,而不是循环其中一个进行一场比赛。


干杯

java junit assertj

2
推荐指数
1
解决办法
3343
查看次数

AssertJ:集合包含值以字符串结尾的元素

我想检查正在测试的集合是否包含以特定字符串结尾的任何元素。

对于 Hamcrest,它可能是这样的:

assertThat("Contains an element ending with 'xyz'", 
               myCollection, hasItems(endsWith("xyz")));
Run Code Online (Sandbox Code Playgroud)

如何使用 AssertJ 做同样的事情?

java assertj

2
推荐指数
1
解决办法
2063
查看次数

当类字段是集合时,AssertJ usingRecursiveComparison 失败

class Person {
  private List<Phone> phones;
}
class Phone {
  private String number;
}

assertThat(result).usingRecursiveComparison()
        .ignoringCollectionOrder()
        .isEqualTo(expectedPerson);
Run Code Online (Sandbox Code Playgroud)

具有expectedPerson相同数量的电话和电话号码,但测试失败,因为列表引用不同。如果我没记错的话,usingRecursiveComparison只会比较价值。那么为什么这里失败了呢?

java unit-testing assertj junit5

2
推荐指数
1
解决办法
3895
查看次数

Java - 在 JUnit 测试中不实现 equals 方法的对象的深度比较

如何在测试中根据字段值“深度”比较两个未实现 equals 方法的对象?

在我的示例中,我有来自两个不同版本的 XML 模式的两个对象,它们仅在版本上有所不同,在我的测试中,我想表明推土机映射的结果等于原始. 自动生成的类不实现 equals 方法

my.new.schema.Element new = mapper.map(old, my.new.schema.Element.class);

assertEquals(old, new); //obviously doesn't work
Run Code Online (Sandbox Code Playgroud)

java junit assertj

2
推荐指数
1
解决办法
1669
查看次数

Java不捕获异常

我正在尝试为构造函数实现 lambda 表达式。我的构造函数可以抛出 IllegalArgumentException。我尝试了不同的方法。第一种方法是调用 lambda 表达式:

catchThrowable(() -> new SomeClass(testVar1, null, testVar2));
Run Code Online (Sandbox Code Playgroud)

它工作得很好,我可以捕获异常然后解析它。当我尝试使用自己的界面时出现问题:

interface SomeClassFactory{
        SomeClass create (String testVar1, String persId, String testVar2) throws IllegalArgumentException;
}

SomeClassFactory factory = SomeClass::new;
Run Code Online (Sandbox Code Playgroud)

然后我用它作为:

catchThrowable((ThrowableAssert.ThrowingCallable) factory.create(testVar1, null, testVar3));
Run Code Online (Sandbox Code Playgroud)

但最后一行代码没有捕获任何异常,我的代码给出了运行时异常并停止。您能否解释一下为什么会发生这种情况,如果可能的话,如何解决?

java lambda junit assertj junit5

2
推荐指数
1
解决办法
213
查看次数

Java Instant 和 Postgres TIMESTAMPTZ 之间有 3 位数字的差异

给定 Java 中的以下字段:

private Instant createdDate = Instant.now();
Run Code Online (Sandbox Code Playgroud)

对应Postgres中的以下字段:

created_date TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP;
Run Code Online (Sandbox Code Playgroud)

并使用 Spring Data JDBC CrudRepository save(S实体)保存到数据库。

检查原始对象字段和保存的对象字段是否相等时:

assertThat(original_obj.getCreatedDate()).isEqualTo(database_obj.getCreatedDate());
Run Code Online (Sandbox Code Playgroud)

我得到以下不匹配:

org.opentest4j.AssertionFailedError:
      expected: 2023-05-29T10:41:12.555839137Z
       but was: 2023-05-29T10:41:12.555839Z
Run Code Online (Sandbox Code Playgroud)

看起来Instant从数据库加载的数字比原始 Instant 少了 3 位。

我怎样才能使两个时刻匹配?为什么它们不同?

java postgresql assertj spring-data-jdbc

2
推荐指数
1
解决办法
179
查看次数

强制 AssertJ 按身份进行比较的惯用方法?

AssertJ的assertThat(...).isEqualTo()方法比较.equals()默认使用。这通常是正确的选择,但有时您确实想通过精确的对象标识/引用标识进行比较(==Java 中的“双等于”,Kotlin 中的“三等于” ===)。

是否有一种惯用的方法来强制 AssertJ 进行这种比较,例如我不知道的断言方法?

我能做的最好的事情就是通过在没有 AssertJ 的情况下进行比较来解决这个问题,然后仅使用它来检查生成的布尔值:

科特林:

assertThat(obj1 === obj2).isTrue()
Run Code Online (Sandbox Code Playgroud)

爪哇:

assertThat(obj1 == obj2).isTrue();
Run Code Online (Sandbox Code Playgroud)

正如我已经暗示的那样,这并不理想,因为 a) 与其他断言相比,它看起来不一致,b) 当断言失败时产生的错误消息只是说“预期为真,结果为假”,这并不像显示的那么好所讨论的不同对象(即使它们仅在内存位置上有所不同,而不是其内容不同)。

java testing equality kotlin assertj

2
推荐指数
1
解决办法
150
查看次数