2017-10-30 18 views
0

私は最初のテストを書いています。いくつかのオブジェクトがupdateメソッドの後に更新された場合、私はテストが必要なので、ここで私のテストの構造体である:テストされたオブジェクトがアサーションの前にヌルでないかどうかをテストする正しい方法

@Test 
public void myTest { 
    // init myObj variable which I want test 
    // myObjService is my service for my object which I've initialized in @Before tagged function 
    MyObj myObj = myObjService.getById(465); 

    // test if that variable is initialized, and it is not null 
    Assert.assertNotNull(myObj); 

    // update some properties of myObj 
    myObj.setX(...); 
    myObj.setY(...); 
    ... 

    // call update function which update obj in collection by Id of object 
    myObjService.update(myObj); 

    // get object with same id which should be with updated properties 
    MyObj myUpdatedObj = myObjService.getById(465); 

    // test that properties 
    Assert.assertEquals(myObj.getX(), myUpdatedObj.getX()); 
    Assert.assertEquals(myObj.getY(), myUpdatedObj.getY()); 
    ... 
} 

は、その手順は正しいですか、私は何かを編集する必要がありますか?

+0

まず、2つのテストがあります。 Given/When/Thenを覚えておいてください。与えられたId、 'myObjService.getById(465)'、 'Assert.assertNotNull(myObj)'。テストを分割することができます。 –

+0

@DjoryKrache正しい例を表示できますか?どのように私はそれを分割する必要があるので、私はmyObjがその関数を呼び出す前にnullでないことを確認したいので。 –

答えて

1

は、なぜあなたは、すべてのNULLチェックが必要なのでしょうか?どんな利点がありますか?理由は次のとおりです。

  1. テスト自体のすべてのテストデータを準備することで、nullが可能かどうかを明示的に制御できます。
  2. 何らかの理由でこれを行うことができない場合でも、テストから必要なものは、失敗したときに何が起きたのかを明確に示すことです。スタックトレースのNPEで簡単に見つけることができます。だから、私は余分な線でテストを妨害しないだろう。特に、あなたのケースでは、テスト設定のバグのためにnullが発生する可能性が高いことを考えると、

私の推薦は、テスト自体にすべてのデータを準備するために、次のようになります。あなたが詳細に興味があるなら

public void updatesAllFieldsOfDog() { 
    //creates object with random values 
    Dog original = dao.createDog(Dog.random()); 
    //create new object with random fields and set the ID to the original 
    //which effectively means - original object with all fields updated 
    Dog updated = Dog.random().setId(original.getId()); 
    dao.updateDog(updated); 
    Dog fromDb = dao.getDog(original.getId()); 
    //Method from Unitils that compares all the fields 
    assertReflectionEquals(updated, fromDb); 
} 

同様の試験がhereを見つけることができます。

1

この手順では、テストの開始時にフィールドが新しい値に設定されないようにするための重要なステップがありません。

は、テストにこれらの行を追加します。

MyObj myObj = myObjService.getById(465); 
Assert.assertNotEquals("newValue1", myObj.getX()); 
Assert.assertNotEquals("newValue2", myObj.getY()); 
+0

これを追加しました。そして、テストされたオブジェクトのヌルをチェックする最初のステップは正しいですか?私はここで私の学校の仲間からいくつかの機能を使うべきだと思いますが、どう思いますか? –

+0

@DenisStephanovはい、あなたが正しいです、ヌルチェックは間違いなくそこにあります。私はあなたのシナリオで "仮定"機能についてはわかりません。 – dasblinkenlight

1

まず、分割することができます。

@Test 
public void retreiveMyObjTest { 
    // GIVEN 
    Integer myObjId = 465; 
    // WHEN 
    MyObj myObj = myObjService.getById(465); 
    // THEN 
    Assert.assertNotNull(myObj); 
    Assert.assertEquals(myObjId, myObj.getId()); 
    ... 
} 
@Test 
public void updateMyObjTest { 
    // GIVEN 
    MyObj myObj = myObjService.getById(465); 
    // WHEN 
    myObj.setX(...); 
    myObj.setY(...); 
    myObjService.update(myObj); 
    MyObj myUpdatedObj = myObjService.getById(465); 
    // THEN 
    Assert.assertEquals(myObj.getX(), myUpdatedObj.getX()); 
    Assert.assertEquals(myObj.getY(), myUpdatedObj.getY()); 
    ... 
} 

ほとんどの場合、ID 465がデータベースにあると予測することはできません。より抽象的なものを見つけ出すか、テストのためにのみ別のデータベースを使うべきです。

関連する問題