2017-08-15 7 views
1

私はJavaプロジェクトをKotlinに変換しています。 UserオブジェクトをKotlinに変換しました.JotnitテストをJavaで実行すると、Kotlin Userオブジェクトの2つのインスタンス間でエラーが発生します。Kotlinクラスのインスタンスが正しくアサートされない

User.kt:私はJavaの比較でKotlinクラスに正しく行われないと信じて

data class User (
@Id 
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "sequenceGenerator") 
@SequenceGenerator(name = "sequenceGenerator") 
var id: Long? = null, 
... 
) 

TestUtil.java

import static org.assertj.core.api.Assertions.assertThat; 

public class TestUtil { 
    public static void equalsVerifier(Class clazz) throws Exception { 
     Object domainObject1 = clazz.getConstructor().newInstance(); 
     // Test with an instance of the same class 
     Object domainObject2 = clazz.getConstructor().newInstance(); 
     assertThat(domainObject1).isNotEqualTo(domainObject2); 
    } 
} 

assertThat(domainObject1).isNotEqualTo(domainObject2)テストは、失敗します。これをデバッガで実行すると、domainObject1domainObject2が異なるインスタンスであることがわかります。

このテストケースを通過させることは可能ですか?他のJavaクラスに対しても同じテストケースが使用されるため、JavaクラスとKotlinクラスの両方で動作する必要があります。

+0

'data'キーワードを削除した場合、失敗したテストは合格となります。これはKotlin [data class](https://kotlinlang.org/docs/reference/data-classes.html#data-classes)がプライマリコンストラクタのプロパティと比較するために 'equals'メソッドを生成します。 –

答えて

1

isNotEqualToequalsとなります。 Kotlinクラスはdata classの正しいequalsメソッドを実装しています。だからdomainObject1.equals(domainObject2)が真です。この動作は正しいです。

だけAssertJのドキュメントを見て:

isNotSameAs(Object other): 
    Verifies that the actual value is not the same as the given one, 
    ie using == comparison. 

私はあなたが試してみてくださいと思う:Kotlinで

assertThat(domainObject1).isNotSameAs(domainObject2); 
1

を、equals()は、プロパティの等価性をチェックするためにdata classに対して自動的に生成されます。 「アクションでKotlin」から

引用:

生成等号()メソッドは、すべてのプロパティの値が等しいことをチェックします。 ...プライマリコンストラクタで宣言されていないプロパティは、等価チェックとハッシュコード計算には参加しません。

あなたはそれを変更することなく、テストケースを渡したい場合は、referential equalityをチェックするために、あなたのデータクラスのequals()を無効にすることができます。あなたのデータクラスのstructural equalityに依存している任意の関数がある場合、それは、あなたの他のコードに影響を与える可能性があることを

override fun equals(other: Any?) = this === other 

は注意してください。だから、代わりに@ shawnの答えを参照してテストケースを変更することをお勧めします。

関連する問題