比较单位测试中不同类别的两个对象中的所有属性



我有一些(不同类(的对象,例如pershtype1和personpe2,并试图比较测试案例中的字段是相等的。场景就像:

jsonA -> PersonTypeA;
jsonB -> PersonTypeB;

personpea.class和entertypeb.Class具有相同的属性,例如ID,名称等。

我试图断言这些值是平等的:

assertEquals(personA.getId(), personB.getId());

我无法使用Mockito提供的标准反射等同,因为这些类不一样。我没有计划编写一堆额外的代码来比较obejcts。在以下行中的其他内容:

Assert.assertTrue(new ReflectionEquals(expected, excludeFields).matches(actual)); //mockito

to

Assert.assertTrue(compareProperties(expected, excludeFields).matches(actual));

编辑1:这不是重复的问题我正在尝试比较 2不同类的不同对象,如果它们在具有相同名称的属性中具有相同的值。我可以编写代码,但是如果已经在Junit5,Mockito,Hamcrest等

assertEquals(objA.getId(), objB.getId());
//like this there are 30 properties

也有嵌套对象,例如列表,一组字符串。手动比较它们太多疼痛

编辑2:也许这会更好地解释

我对波约斯没有控制权。他们由其他人拥有。因此,从本质上讲,如果我有两个类

class Cat{
  String id;
  String name;
  // 30 more properties
}
class Dog{
  String id;
  String name;
 // 30 more properties
}

如何比较猫和狗在ID,名称等中具有相同的值。因为有很多属性,所以我不想写

assertEquals(cat.getId(), dog.getId());

那么,有什么效用吗?我们可以通过另一种方式进行操作,如果我们有2个对象(不同类(,则可以在Spring和Apache Bean Utils中使用BeanUtils.copyProperies(o1, o2)复制属性。同样,有一种方法可以比较属性?

有很多方法可以实现目标,命名一些:

选项1

创建自己的匹配器,您将能够使用类似的东西:

assertThat(actual, MyMatchers.semanticallyEqualsTo(expected));

选项2

创建一种自定义方法"比较eproperties(预期,实际("较少的BDD样式,但仍然可以正常工作

选项3

提供转换器方法:

class PersonTypeA {
   public PersonTypeB asTypeB() {
     ... if it has same properties, the conversion is trivial
     return new PersonTypeB   
   }
}

然后在测试中使用此方法,以便预期和实际类型相同,您可以使用常规assertEquals

选项4

提供某种类型的"两个对象的共同表示"。您已经提到它们与JSON有关,因此您可能可以将这两个值视为某种JSON:

 class PersonTypeA {
    public JSONObject toJson() {...}
 }
 class PersonTypeB {
    public JSONObject toJson();
 }

然后,在测试中,您可以将JSON与JSON进行比较。由于它比简单的字符串比较更复杂(json的键/值对(,因此可能需要一个JSON比较库进行测试。像jsonassert一样,还有其他。

注意:选项3和4也可以在某些实用程序类中"外部"到PersonTypeAPersonTypeB

我个人会选择第一个选项,尤其是如果您在许多测试中都面临此问题,因为毕竟它允许编写最干净的测试,并且至少比选项4的性能略高,而毫无疑问需要摆弄JSON转换。

但是从技术上讲,所有选项在这里都是有效的

我没有得到任何解决方案,但会写出我的工作。

对于同一类对象比较,我们可以使用以下类似的Mockito ReflectionEquals。按照原始答案的链接

assertTrue(new ReflectionEquals(deployments.get(0)).matches(returnedDeployments.get(0)));

https://stackoverflow.com/a/29793460/3497657

我看到的是因为反射等式是一个内部类,最好使用hamcrest Samepropertyvaluesas这样:

assertThat(returnedDeployments.get(0), samePropertyValuesAs(deployments.get(0)));

对于不同类的对象,我没有找到任何东西,所以我必须自己写一个匹配器

public class HasSameProperties<T> extends TypeSafeDiagnosingMatcher<T> {
  private ClassA obj1;
  public HasSameProperties(ClassA obj1) {
    this.obj1 = obj1;
  }
  @Override
  protected boolean matchesSafely(T item, Description mismatchDescription) {
     if (item instanceof ClassA)
       return matchClassA((ClassA) item);
     return null;
  }
  public static Matcher<ClassB> hasSameProperties(ClassA objA) {
    return new HasSameProperties(objA);
  }
  private boolean matchClassA(ClassB objB) {
    assertThat(objB.getId(), equalTo(objA.getId()));
    //other getters and setters
    return true;
  }

相关内容

  • 没有找到相关文章

最新更新