Java断言:如何对相同值的2个字段进行断言

Java断言:如何对相同值的2个字段进行断言,java,junit,Java,Junit,在我的代码中,我必须对两个字段声明一个值。这就是我要做的: assertThat(request.get(0).name()).isEqualTo("ABC"); assertThat(request.get(0).name2()).isEqualTo("ABC"); 如何对上述两行使用一行断言 例如,为了进一步解释我需要什么: 我有没有办法实现以下目标: assertThat(request.get(0).name() && request.get(0).name2()).i

在我的代码中,我必须对两个字段声明一个值。这就是我要做的:

assertThat(request.get(0).name()).isEqualTo("ABC");
assertThat(request.get(0).name2()).isEqualTo("ABC");
如何对上述两行使用一行断言

例如,为了进一步解释我需要什么:

我有没有办法实现以下目标:

assertThat(request.get(0).name() && request.get(0).name2()).isEqualTo("ABC");

也许有点太聪明了,但你可以试试这个:

assertTrue(Stream.of(request.get(0).name(), request.get(0).name2())
        .allMatch("ABC"::equals));
或者你可以让它旋转一下:

assertThat(Arrays.asList(request.get(0).name(), request.get(0).name2()),
        Every.everyItem(IsEqual.equalTo("ABC")));
比如:

assertThat(request.get(0).name().equals( request.get(0).name2()) ? 
                       request.get(0).name() : "false").isEqualTo("ABC");
如何对上述两行使用一行断言

你为什么要做这样的事

尝试太聪明会有两个缺点:

  • 您将使您的测试更加复杂,难以阅读和维护
  • 当测试失败时,您将丢失相关反馈信息
实际上你的测试很好。
如果这两个值中的任何一个不符合断言,那么您就有了发现问题的准确行,并且您还有一条相关的信息消息。

作为提示,您可以删除重复项:

final String expected = "ABC";
assertThat(request.get(0).name()).isEqualTo(expected);
assertThat(request.get(0).name2()).isEqualTo(expected);
我不想说在同一个语句中做出多个断言是不好的。
一点也不。
我只是说,您必须根据所使用的工具调整您的断言方式。
关于它,您不需要指定匹配器工具。
如果matcher工具提供了对此类断言的支持,请使用它。
否则,不要以原始的方式进行测试,否则您将失去获得有用的失败测试消息的好处


下面是一个使用AssertJ的示例,它提供了这种开箱即用的功能。

@Test
void namesEquals() {
    List<Request> requests = new ArrayList<>();
    requests.add(new Request("ABC", "ABD"));
    Assertions.assertThat(requests.get(0)).extracting(Request::name, Request::name2)
                                          .containsExactly("ABC", "ABC");
}
@测试
void namesEquals(){
列表请求=新建ArrayList();
请求。添加(新请求(“ABC”、“ABD”);
Assertions.assertThat(requests.get(0)).extracting(请求::名称,请求::名称2)
.实际包含(“ABC”、“ABC”);
}
在这次失败的测试中,您将得到一条有用的信息:

java.lang.AssertionError:

期望:

完全包含(并按相同顺序):

但未找到某些元素:

其他人则没有预料到:


我的问题与链接中的问题不同。