2017-08-15 3 views
1

Ich konvertiere ein Java-Projekt in Kotlin. Ich habe ein User Objekt in Kotlin umgewandelt und wenn ich die vorhandenen JUnit Tests in Java starte, erhalte ich einen Fehler zwischen zwei Instanzen des Kotlin User Objekts.Kotlin Klasse Instanz Assert nicht korrekt

User.kt:

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); 
    } 
} 

Der assertThat(domainObject1).isNotEqualTo(domainObject2) Test nicht besteht, wie ich in Java Vergleich glauben nicht korrekt auf der Kotlin Klasse getan. Wenn ich dies durch einen Debugger durchführe, kann ich sehen, dass domainObject1 und domainObject2 unterschiedliche Instanzen sind.

Ist es möglich, diesen Testfall zu bestehen? Derselbe Testfall wird für andere Java-Klassen verwendet, er muss also sowohl für Java- als auch für Kotlin-Klassen funktionieren.

+0

Wenn Sie die Schlüsselwörter 'data' entfernen, wird der fehlgeschlagene Test bestanden, weil Kotlin [Datenklasse] (https://kotlinlang.org/docs/reference/data-classes.html#data-classes) dies tut generiert 'equals'-Methode zum Vergleich mit Eigenschaften im primären Konstruktor. –

Antwort

1

Die isNotEqualTo Anrufe equals. Die Kotlin-Klasse implementiert das korrekte equals-Verfahren für data class. So ist domainObject1.equals(domainObject2) wahr. Dieses Verhalten ist korrekt.

schauen Sie in die AssertJ Dokument:

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

Ich denke, Sie sollten versuchen:

assertThat(domainObject1).isNotSameAs(domainObject2); 
1

In Kotlin wird equals() erzeugt automatisch für data class für die Gleichstellung der Eigenschaften zu überprüfen.

Zitat aus "Kotlin in Aktion":

Die erzeugten equals() Methode überprüft, dass die Werte aller Eigenschaften gleich sind. ... Beachten Sie, dass Eigenschaften, die nicht im primären Konstruktor deklariert sind, nicht an den Gleichheitsprüfungen und der Hashcodeberechnung teilnehmen.

Wenn Sie den Testfall übergeben möchten, ohne es zu ändern, können Sie equals() Ihrer Datenklasse außer Kraft setzen für referential equality zu überprüfen.

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

Beachten Sie, dass es Ihren anderen Code beeinflussen kann, wenn es eine Funktion, die auf structural equality Ihrer Datenklasse setzt ist. Also schlage ich vor, dass Sie sich auf @ shawns Antwort beziehen, um stattdessen Ihren Testfall zu ändern.

Verwandte Themen