【问题标题】:Compare 2 objects ignoring null values比较 2 个忽略空值的对象
【发布时间】:2020-05-07 14:55:20
【问题描述】:

项目使用TestNg、Java11、Spring测试

我正在为 API 编写 testNG 测试 我有一个具有这种结构的 java 对象:

class Object1
    private Object2 o2;
    private List<Object3> o3;

其中Object2 不仅由原始属性组成。

我想测试 2 Object1 是否与这些规则相等:

  • 如果实际o2 为空,即使另一个o2 不是,也不要失败
  • 如果实际 o3 为 null 或为空,即使另一个 o3 不是,也不要失败
  • 如果实际o3 既不为空也不为空,则仅比较非空Object3 字段

总而言之,我想断言 2 个对象是相同的,递归地忽略空字段。

我能做到

assertThat(actual).usingRecursiveComparison().ignoringActualNullFields().isEqualTo(other);

但不会忽略递归的空字段。

我该如何解决这个问题?

【问题讨论】:

    标签: java assertj


    【解决方案1】:

    你也可以忽略expected null fields.

    您能否提供一个简单的测试来重现该问题? 随时在https://github.com/joel-costigliola/assertj-core/issues 中提出问题

    【讨论】:

      【解决方案2】:

      对我来说,以下代码有效:

      public class SocialLink {
          private String platform;
          private String link;
      }
      
      SocialLink obj1 = new SocialLink("Facebook", null);
      SocialLink obj2 = new SocialLink("Facebook", null);
      
      assertThat(obj1).isEqualToIgnoringNullFields(obj2);
      

      【讨论】:

      • 感谢您的回复。我将它用于其他对象,但在这里我有一个自定义 pojo 列表,我不是那么容易
      【解决方案3】:

      我终于像这样创建了自己的断言:

      import org.assertj.core.api.AbstractAssert;
      import org.assertj.core.api.Assertions;
      
      import java.util.List;
      import java.util.stream.Collectors;
      
      public class Object1Assert extends AbstractAssert<Object1Assert, Object1> {
      
          public Object1Assert isEqualTo(Object1 other) {
      
              // specially for null
              if(actual == other) {return this;}
      
              if(actual.getObject2() != null) {
                  Assertions.assertThat(other.getObject2()).isEqualToIgnoringNullFields(actual.getObject2());
              }
      
              if(actual.getObject3() != null) {
                  for(Object3 object3 : actual.getObject3()) {
                      my.package.Assertions.assertThat(object3).isIn(other.getObject3());
                  }
              }
              // return the current assertion for method chaining
              return this;
          }
      
          public Object1Assert(Object1 actual) {
              super(actual, Object1Assert.class);
          }
      
          public static Object1Assert assertThat(Object1 actual) {
              return new Object1Assert(actual);
          }
      
      }
      
      
      public class Assertions {
      
          public static Object3Assert assertThat(Object3 actual) {
              return new Object3Assert(actual);
          }
      }
      
      public class Object3Assert extends AbstractAssert<Object3Assert, Object3> {
      
          public Object3Assert isIn(List<Object3> others) {
              List<String> otherStringIds = others.stream().map(Object3::getStringId).collect(Collectors.toList());
              Assertions.assertThat(otherStringIds).isNotEmpty();
              Assertions.assertThat(actual.getStringId()).isIn(otherStringIds);
              for (Object3 otherObject3 : others) {
                  if(actual.getStringId().equalsIgnoreCase(otherObject3.getStringId())) {
                      Assertions.assertThat(otherObject3).usingComparatorForType(Comparators.bigDecimalComparator, BigDecimal.class).isEqualToIgnoringNullFields(actual);
                  }
              }
              // return the current assertion for method chaining
              return this;
          }
      
          public Object3Assert(Object3 actual) {
              super(actual, Object3Assert.class);
          }
      
          public static Object3Assert assertThat(Object3 actual) {
              return new Object3Assert(actual);
          }
      
      }
      

      我为本教程所需的每种类型都创建了这个类 https://www.baeldung.com/assertj-custom-assertion

      【讨论】:

      • 为了让这对未来的读者真正有帮助,为什么不给出一个带有一些虚拟类和断言的小代码 sn-p 呢?
      • 我编辑了答案以添加更多代码和我遵循的教程
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2017-01-27
      • 2021-04-30
      • 2014-07-12
      • 1970-01-01
      相关资源
      最近更新 更多