首页 > 解决方案 > Java Mocking - 在外部类中注入`equals`和`toString`

问题描述

在尝试测试与外部 API 的接口时,我遇到了一些麻烦。特别是说 API 用于数据存储的大量类equalstoString方法没有,这使得比较 API 是否创建了我期望的对象非常困难,因为它们以大量复杂的列表映射组合返回。如果我想手动检查相等性,我每次都必须编写自定义的深度相等性检查。

所以我想知道是否可以使用 PowerMock、Mockito 和 JUnit 4(这是我的测试环境)将自定义实现eqauls(甚至可能toString)注入到该类中。或者是否有办法告诉 JUnit 使用自定义方法来比较这些数据类的对象。
欢迎与该设置良好集成的库。

标签: javaunit-testingmockingjunit4powermockito

解决方案


这些方法与您仅编写代理对象相同,例如:

public class A {
    int c;
    int d;
}

public class B extends A {
    @Override
    public boolean equals(Object o) {
        if (o instanceof A) {
            A a = (A) o;
            return this.c == a.c && this.d == a.d;
        } else {
            return false;
        }
    }

    @Override
    public String toString() {
        return "B [c=" + c + ", d=" + d + "]";
    }
}

您不能可靠地更改底层类 ( A) 的实现,而不会冒着在代码中其他地方传播异常的风险,这些异常可能依赖于toStringto的行为equals,这不太可能,但下次停止工作时这仍然是一个问题。如果您只是在测试中而不是在生产中执行此操作,那么这可能是可以接受的,您可以咨询该领域的现有问题,例如是否可以在运行时覆盖方法?


推荐阅读