2016-05-18 10 views
1

私はjava/kotlinを使い慣れました。KotlinクラスインスタンスassertEqual

class FactoryTest { 
    @Test 
    fun testFactorySuccess() { 
     val args = arrayOf("place", "WEST", "1", "1") 

     Assert.assertEqual(PlaceCommand(*args), Factory(args) as PlaceCommand) 
     # or 
     Assert.assertTrue(PlaceCommand(*args).equal(Factory(args) as PlaceCommand)) 
    } 

    // ... 
} 

ありがとう:のようなものに

class FactoryTest { 
    @Test 
    fun testFactorySuccess() { 
     val args = arrayOf("place", "WEST", "1", "1") 
     val a = PlaceCommand(*args) 
     val b = Factory(args) as PlaceCommand 

     Assert.assertTrue(a.x.equals(b.x)) 
     Assert.assertTrue(a.y.equals(b.y)) 
     Assert.assertTrue(a.direction.equals(b.direction)) 
    } 

    // ... 
} 

class PlaceCommand(vararg args: String) : ICommand { 
    var direction: Direction = Direction.valueOf(args[1].toUpperCase()) 
    var x: Int    = args[2].toInt() 
    var y: Int    = args[3].toInt() 

    // ... 
} 

回すためには何が必要です変更:私は、次のクラスに平等を主張したいと思います。

+0

btw、この場合の 'vararg'を使うことは恐ろしい考えのようです。あなたは何も得ておらず、そうでなければタイプ情報が失われます – voddan

+0

私はあなたの見方に同意します。コードを見てみましょう:https://github.com/jamesmoriarty/kotlin-robot/blob/master/src/test/CommandFactoryTest.kt – Moriarty

+0

'Command'ファクトリを除いて、すべて正常に見えます。私は、文字列の配列を内部的に使用し、型付きの値に変換する理由を想像することはできません。 – voddan

答えて

4

あなたがのIntelliJアイデアを使用している場合は、それを生成するAlt+Insertを押すことができますPlaceCommand

override fun equals(other: Any?): Boolean{ 
    if (this === other) return true 
    if (other?.javaClass != javaClass) return false 

    other as PlaceCommand 

    if (x != other.x) return false 
    if (y != other.y) return false 

    return true 
} 

equalsメソッドをオーバーライドすることができます。

は、それからちょうど平等kotlin ==

Assert.assertTrue(PlaceCommand(*args) == (Factory(args) as PlaceCommand))

をテストする==演算子を使用することはa?.equals(b) ?: b === nullに相当します。 ===は参照同値です

+0

ありがとうございます。出来た。 – Moriarty