我使用 JUnit 4.12 和 AssertJ 3.11.0 进行了以下单元测试,并获得了有趣的结果。helloTest是green但是worldTest是red。
@Test
public void helloTest() {
Object[] array = new Object[2];
String[] firstElement = new String[]{"Hello"};
String[] secondElement = new String[]{"World"};
array[0] = firstElement;
array[1] = secondElement;
assertThat(array).containsExactlyInAnyOrder(firstElement, secondElement);
}
@Test
public void worldTest() {
Object[] array = new Object[1];
String[] element = new String[]{"Hello"};
array[0] = element;
assertThat(array).containsExactlyInAnyOrder(element);
}
Run Code Online (Sandbox Code Playgroud)
AssertJ 的结果是
java.lang.AssertionError:
Expecting:
<[["Hello"]]>
to contain exactly in any order:
<["Hello"]>
elements not found:
<["Hello"]> …Run Code Online (Sandbox Code Playgroud) 我希望在测试中比较 2 个对象列表(比如 Foo)。
List<Foo> fooA;
List<Foo> fooB;
Run Code Online (Sandbox Code Playgroud)
每个 Foo 条目都有一个 List 类型的字段(比如 Bar)
class Foo {
private List<Bar> bars;
....
}
assertThat(fooA).isEqualTo(fooB);
Run Code Online (Sandbox Code Playgroud)
比较失败,因为条形的元素相同但顺序不同。
有没有办法比较它们而忽略顺序?
我不是在寻找以下选项。
assertThat(fooA).usingElementComparatorIgnoringFields("bars").isEqualTo(fooB);
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想比较所有领域
我在Eclipse使用Maven. package org.assertj.core.api即使我在我的pom.xml3.6.2 版中将其指定为 3.6.2 版,但我得到的信息
并不存在JDK 1.8.
如何克服它?
mvn clean install正在失败。
无法在项目 com.transunion.qa.datahub.ui.java.bdd.serenity 上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile): Compilation failure: Compilation failure:
[错误] /Users/pnutala/eclipse-photon-workspace/com.transunion.datahub.ui.qc.java.bdd.serenity/src/main/java/com/transunion/qc/steplibrary/datahub/DeCoherentUser.java: [7,35] 包 org.assertj.core.api 不存在
[错误] /Users/pnutala/eclipse-photon-workspace/com.transunion.datahub.ui.qc.java.bdd.serenity/src/main/java/com/transunion/qc/steplibrary/datahub/DeCoherentUser.java: [7,1] 仅从类和接口静态导入 [错误] -> [帮助 1]
试过了Mvn clean install,verify没有成功。
import static org.assertj.core.api.Assertions.assertThat;
@Step
public void landedOnListPage(String expectedTotle) {
assertThat(currentListPage.getTitle()).containsIgnoringCase(expectedTotle);
Run Code Online (Sandbox Code Playgroud) 我正在使用 Java 和 AssertJ 测试一些 UI 功能。因此,当我从 UI 收到一些大字符串时,我应该验证该字符串是否至少包含一个来自List<String>. 做相反的事情很容易 - 验证列表是否至少包含一次某个字符串值,但这不是我的情况。我在标准方法中找不到解决方案。
public static final List<String> OPTIONS = Arrays.asList("Foo", "Bar", "Baz");
String text = "Just some random text with bar";
Run Code Online (Sandbox Code Playgroud)
我需要的是这样的:
Assertions.assertThat(text)
.as("Should contain at least one value from OPTIONS ")
.containsAnyOf(OPTIONS)
Run Code Online (Sandbox Code Playgroud) 当我尝试测试此方法时
static void validatePostcode(final String postcode, final String addressLine)
{
if(! hasValidPostcode(postcode, addressLine)) {
throw new InvalidFieldException("Postcode is null or empty ");
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下测试
@Test
public void testThrowsAnException()
{
assertThatThrownBy(validatePostcode("", "")).isInstanceOf(InvalidFieldException.class);
}
Run Code Online (Sandbox Code Playgroud)
我在 IntelliJ 中收到此错误消息
断言中的 assertThatThrownBy (org.assertj.core.api.ThrowableAssert.ThrowingCallable) 不能应用于 (void)
与assertThatExceptionOfType.
是否可以使用 AssertJ 测试该静态方法实际上引发了未经检查的异常?我应该在考试中改变什么?
我正在寻找一种解决方案,以检查集合中的每个项目都具有expectedNullFieldnull 字段。
以下内容不起作用:
assertThat(aCollection).extracting("expectedNullField").isNull();
请注意以下工作正常:
assertThat(aCollection).extracting("expectedNotNullField").isNotNull();
有人帮我吗?
谢谢。
在我的 JUnit 测试中,我想断言列表中恰好包含一个满足给定条件的元素(列表中可以有很多元素,但只有一个元素应该满足条件)。我写了下面的代码,但我想知道是否可以去掉“new Condition<>”部分并使用“纯”lambda?或者还有其他更优雅的方法来完成我想做的事情吗?
class Foo {
String u;
Foo(String u) { this.u = u; }
String getIt() { return u; }
}
@Test
public void testIt() {
List<Foo> list = Lists.newArrayList(new Foo("abc"), new Foo("xyz"));
assertThat(list)
.haveExactly(1, new Condition<>(
x -> "xyz".equals(x.getIt()),
"Fail"));
}
Run Code Online (Sandbox Code Playgroud) 下面是一个例子:
assertThat(commentById.getId()).isNotNull();
assertThat(commentById.getContent()).isNotBlank();
assertThat(commentById.getAuthor()).isNotNull();
assertThat(commentById.getAuthor().getUsername()).isNotBlank();
assertThat(commentById.getAuthor().getAvatar()).isNotBlank();
assertThat(commentById.getAuthor().getId()).isNotNull();
Run Code Online (Sandbox Code Playgroud)
反正有没有把它链接成一个assertThat语句
抱歉,问题不清楚。我的意思是,是否有一些流畅的方法调用可以将多个 assertThat 语句链接在一起。这是我能想到的一个例子:
assertThat(commentById)
.isNotNull()
.and(Comment::getID).isNotNull()
.and(Comment::getContent).isNotBlank()
.and(Comment::getAuthor).is(author->{
author.isNotNull()
.and(User::getID).isNotNull()
.and(User::getAvatar).isNotBlank()
.and(User::getUsername).isNotBlank()
});
Run Code Online (Sandbox Code Playgroud) 我有两个类要使用JUnit/进行测试Mockito:
public class ClassA {
private int sk;
// getters and setters
}
public class ClassB {
private int sk;
private List<ClassA> lista;
// getters and setters
}
Run Code Online (Sandbox Code Playgroud)
然后在我的测试课中,使用AssertJ:
List<ClassA> lista = //... populated with list of objects of ClassA
ClassB expected = new ClassB();
expected.setSk(5);
expected.setLista(lista);
ClassB actual = getItFromTheClassToTest();
assertThat(actual).usingRecursiveComparison()
.ignoringFields("sk") // need to ignore only classA.sk
.isEqualTo(expected);
Run Code Online (Sandbox Code Playgroud)
问题是该名称sk在两个类中都存在,我只需要在 中忽略它ClassA,而不是在ClassB. 这可能吗AssertJ?
在单元测试中使用 AssertJ,我想从此类对象的列表中提取自定义对象的多个属性,extracting并检查它们是否全部非空。
例如,假设我想提取fieldA和:fieldBMyObject
import static from org.assertj.core.api.Assertions.assertThat;
List<MyObject> theList = ...;
assertThat(theList).extracting("fieldA", "fieldB")).isNotNull();
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚正在检查的内容。
正在isNotNull检查:
extracting不为空?