我有一些(不同类(的对象,例如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也可以在某些实用程序类中"外部"到PersonTypeA
和PersonTypeB
。
我个人会选择第一个选项,尤其是如果您在许多测试中都面临此问题,因为毕竟它允许编写最干净的测试,并且至少比选项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;
}