単体テストの要件は次のとおりです。
- 本番クラスの単体テストをしたい
- 本番コードのみをリリースできるように、テスト コードと本番コードを分離したい
これは合理的な要件のようです。ただし、メソッドをオーバーライドassertEquals
する必要があるため、オブジェクトなどのメソッドを使用する必要がある場合は常に問題が発生します。equals
メソッドはequals
本番クラスで実装する必要がありますが、実際にはテストにのみ使用されます。equals
ifがオーバーライドされ、thenhashCode
も実装されるべきであるという適切なコーディング プラクティスが規定されている場合、これはさらに悪化し、未使用のプロダクション コードがさらに多くなり、プロダクション クラスが乱雑になります。
モデルを使用した簡単な例を次に示しUser
ます (IntelliJ 自動実装equals
および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
この問題の解決策の 1 つは、クラスを作成することUserTester
ですassertUserEquals
。JUnit のassertEquals
.
別の解決策は、UserComparator
. ただし、JUnit にassertEquals
はComparator
.
この点でのベストプラクティスは何ですか?