以下是我对单元测试的要求:
- 我想对我的生产类进行单元测试
- 我想将测试代码和生产代码分开,这样我只能发布生产代码
这似乎是合理的要求。但是,当我需要使用诸如assertEquals
对象之类的方法时,总是会出现问题,因为这些方法需要equals
覆盖该方法。该equals
方法必须在生产类中实现,但实际上仅用于测试。equals
当良好的编码实践规定如果被覆盖,则hashCode
也应该实现,从而导致更多未使用的生产代码使生产类混乱,这会变得更糟。
这是一个带有User
模型的简单示例(IntelliJ autoimplemented equals
and hashCode
)
public class User
{
public long id;
public long companyId;
public String name;
public String email;
public long version;
@Override
public boolean equals(Object o)
{
if(this == o) return true;
if(o == null || getClass() != o.getClass()) return false;
User user = (User) o;
if(companyId != user.companyId) return false;
if(id != user.id) return false;
if(version != user.version) return false;
if(!email.equals(user.email)) return false;
if(!name.equals(user.name)) return false;
return true;
}
@Override
public int hashCode()
{
int result = (int) (id ^ (id >>> 32));
result = 31 * result + (int) (companyId ^ (companyId >>> 32));
result = 31 * result + name.hashCode();
result = 31 * result + email.hashCode();
result = 31 * result + (int) (version ^ (version >>> 32));
return result;
}
}
可以看出,equals
占用hashCode
了大量空间并使课堂变得混乱。
该问题的一种解决方案可能是创建一个类 ,UserTester
它可以有一个assertUserEquals
可以用来代替例如的方法。JUnit 的assertEquals
.
另一种解决方案可能是创建一个UserComparator
. 但是,JUnit 似乎没有任何assertEquals
需要Comparator
.
在这一点上的最佳实践是什么?