我有一个在应该时不会失败的测试:
import static org.assertj.core.api.Assertions.assertThat;
@Test
public void testTransactionResponse() {
String id= "004";
long amount= 5000001L;
TransactionResource transactionResource = buildTransactionResource(amount, "EUR");
System.out.println(transactionController.create(id, transactionResource).getStatusCode()); //the output is 403
assertThat(transactionController.create(id, transactionResource).getStatusCode().equals(200)); //is true and test doesn't fail
}
Run Code Online (Sandbox Code Playgroud)
这怎么可能?
所以我有一个字符串/字符串列表对,我想要做的是提取后,将返回的列表合并到一个列表中,我可以执行更多的断言:
MyTest.java
Map<String, List<String>> testMap = new HashMap<>();
List<String> nameList = newArrayList("Dave", "Jeff");
List<String> jobList = newArrayList("Plumber", "Builder");
List<String> cityList = newArrayList("Dover", "Boston");
testMap.put("name", nameList);
testMap.put("job", jobList);
testMap.put("city", cityList);
assertThat(testMap).hasSize(3)
.extracting("name", "city")
//not sure where to go from here to flatten list of lists
// I want to do something like .flatMap().contains(expectedValuesList)
Run Code Online (Sandbox Code Playgroud)
当我调用extract时,它会将列表值拉出到列表列表中,这很好,但是之后我不能调用flatExtracting,因为没有要传入的属性名称,而且从我看过的内容看起来似乎并不好像自定义提取器是合适的(否则我不完全确定如何把它放在一起).有没有另一种方法可以平息我回来的列表清单?我可以去一个稍长的路径并在列表列表上做断言,或者在断言之前使用lambda来收集结果但是我想将断言保持为一个(例如,一些映射断言然后链接一些断言的内容)
与其他一些问题类似,我发现 IntelliJ 神秘地拒绝识别 AssertJ 库。我再次询问,因为(a)我尝试了各种建议,并且(b)我有一个非常简单的例子,任何人都可以尝试自己。
在 IntelliJ 2018 和 IntelliJ 2019 预发布版中,我使用 Maven 原型maven-archetype-quickstart版本 1.4创建了一个新项目。
AssertJ 3 需要 Java 8。所以我将 POM 中的这两行更改为1.7to 11。
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
Run Code Online (Sandbox Code Playgroud)
我将其添加到 POM 中:
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.11.1</version>
<scope>test</scope>
</dependency>
Run Code Online (Sandbox Code Playgroud)
使用IntelliJ 中的Maven面板,我执行了一个clean和install.
看起来不错。我验证org.assertj:assertj-core:3.11.1库出现在IntelliJ的项目面板中。应用程序运行,Hello World出现在 IntelliJ 的控制台上。
在App.java文件中,我添加了这个import语句。
import static org.assertj.core.api.Assertions.* ;
Run Code Online (Sandbox Code Playgroud)
IDE 编辑器中报告的错误:
无法解析符号“断言”
有些人建议损坏的 Maven 缓存。所以我退出了 IntelliJ,并删除了.m2我的主文件夹中的文件夹。我在 IntelliJ 中重新打开我的项目,并重新执行 Maven clean …
我有返回记录列表的方法。每条记录都有设置为字段。
public class R {
public final Set s;
}
Run Code Online (Sandbox Code Playgroud)
我有所有预期集合的列表 - 例如:
Set<String> set1 = new HashSet<String>(); set1.add("s1");
Set<String> set2 = new HashSet<String>(); set1.add("s2");
Set<String> set3 = new HashSet<String>(); set1.add("s3");
Run Code Online (Sandbox Code Playgroud)
我想使用 AssertJ (版本 3.11.1)以简单的方式验证响应List<R>包含所有定义的 Set 或至少这些集合中所有元素的聚合等于集合中元素的聚合set1, set2, set3
注意:以下解决方案不起作用:
Set allElements = new HashSet<String>();
allElements.addAll(set1);
allElements.addAll(set2);
allElements.addAll(set3);
List<R> result = foo();
org.assertj.core.api.Assertions.assertThat(result)
.extracting(record -> record.s)
.containsOnly(allElements);
Run Code Online (Sandbox Code Playgroud)
我有:
java.lang.AssertionError:
Expecting:
<[["s1.1", "s1.2"],
["s2.1", "s2.2"],
["s3.1", "s3.2"]]>
to contain only:
<[["s1.1",
"s1.2",
"s2.1",
"s2.2",
"s3.1", …Run Code Online (Sandbox Code Playgroud) 我有这段代码在更新到 Assertj 3.16.1 后不再有效
Throwable thrown = catchThrowable(() -> myObject.methodThrowsException());
assertThat(thrown).isInstanceOf(MyCustomException.class).extracting("fault").hasOnlyElementsOfType(CustomException.class).extracting("code").containsExactly("AnotherCustomException");
Run Code Online (Sandbox Code Playgroud)
我收到此错误消息:
java:cannot find symbol
symbol: method hasOnlyElementsOfType(java.lang.Class<CustomException.class>)
location: class org.assertj.core.api.AbstractObjectAssert<capture#1 of?, capture#2 of ?>
Run Code Online (Sandbox Code Playgroud)
它要么已被弃用,要么现在以不同的方式实施。我已经浏览了文档并搜索了近两天,看看是否有任何关于如何使用它的信息,而不是以前如何使用它来实现轻松转换,但还没有找到任何东西。当我用它containsOnlyOnceElementsOf代替给出问题的那个时,我实际上得到了一个类似的错误。这些方法是否有其他替代方法可以实现相同的目的?
任何帮助将不胜感激!!!
我正在运行这样的断言:
assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4))
Run Code Online (Sandbox Code Playgroud)
我正进入(状态
期望:<4.00> 等于:<4>
所以我试过了
assertThat(obj.getTotal()).isEqualTo(BigDecimal.valueOf(4.00))
Run Code Online (Sandbox Code Playgroud)
期望:<4.00> 等于:<4.0>
我找到了一种解决方法,在该方法中我将预期值的比例设置4为4.00,但我必须为测试中的所有 BigDecimal 变量这样做似乎很令人恼火。AssertJ 有没有我不知道的更好的方法?
使用Assertj,我可以anyMatch用来测试集合是否至少有一个元素与谓词匹配,例如
var list = List.of("abc", "xyz")
assertThat(list).anyMatch(element -> element.endsWith("xyz"));
Run Code Online (Sandbox Code Playgroud)
但是我如何测试一个集合是否只有一个与谓词匹配的元素?
我正在尝试验证提取列表中的第一项。然而 AssertJList从 中返回一个而不是预期的对象.first()。
给出以下示例
public class AssertJTests
{
@Test
@DisplayName("Region Asia should only have one Country, Malaysia")
public void assertRegion()
{
Region asia = new Region()
.setName("Asia")
.setCountries(Lists.newArrayList("Malaysia"));
Consumer<Region> regionRequirement = region ->
assertThat(region)
.extracting(Region::getName)
.containsOnly("Asia");
Consumer<String> countryRequirement = country ->
assertThat(country)
.isEqualToIgnoringCase("Malaysia");
assertThat(asia)
.isInstanceOfSatisfying(Region.class, regionRequirement)
.extracting(Region::getCountries)
.hasSize(1)
.first()
.isInstanceOfSatisfying(String.class, countryRequirement);
}
protected static class Region
{
private String name;
private List<String> countries;
List<String> getCountries()
{
return countries;
}
Region setCountries(final List<String> pCountries)
{
countries = …Run Code Online (Sandbox Code Playgroud) 是否可以在 Spring Boot 生产代码中使用 AssertJ ?我设法在单元测试中使用它,但是'import static org.assertj.core.api.Assertions.*;' 无法在 src/main/java 文件夹的 java 文件中解析,即使我尝试通过更改构建路径并更改 junit.conf 来修复它。或者在生产代码中使用 AssertJ 是一种不好的做法?
给定
List<Integer> list = ...
Run Code Online (Sandbox Code Playgroud)
我想用 AssertJ 测试它是否已排序。就像是:
assertThat(list).isSorted()
Run Code Online (Sandbox Code Playgroud)
是否可以?
assertj ×10
java ×8
java-8 ×2
junit ×2
assert ×1
junit5 ×1
maven ×1
spring-boot ×1
spring-test ×1
testing ×1
unit-testing ×1