2011-05-10 15 views
4

こんにちは、例えば、私はPersonManagerをテストの対象としています。そして私はdaoを嘲笑しています。EasyMockとMockitoを使ったMocking voidメソッド

class PersonManager { 

    PersonDao dao... 

    PersonManager(PersonDao dao)... 

    Preson find(String person)... 

    void delete(String person)... 

} 

class PersonManagerTest { 

    Map<String, Person> persons ..... = "person1", "person2", "person3"; 

    PersonDao mock... 

    PersonManager manager = new PersonManager(mock); 

    //easy one 
    @Test public void shouldReturnExistingPerson() { 
     expect(mock.find("person1").andReturn(persons.get(0)); 
     Person result = manager.find("person1"); 
     // replay and verify logic 
    } 

    //but what should I do here? 
    @Test public void shouldDeleteExistingPerson() { 
     //should I remove a person from testing Map holding test data? or what am I doing wrong 
    } 
} 

したがって、返却によるテスト方法は簡単でしたが、どのように無効メソッドを設定するのですか?提案ありがとう、そしてMcokitoの例も歓迎されています。 }

+0

これらの回答はどれですか? –

答えて

4

それはあなたがテストしようとしているものに完全に依存します。

mockitoでは、正しいパラメータでDAO削除メソッドが呼び出されたことだけを確認する場合は、verifyが必要です。

PersonManagerのユニットテストでは、PersonDaoをテストしないでください。

+0

リンクが壊れています。 –

1

削除するときに、削除したばかりのオブジェクトを返すことをおすすめします。テストを大幅に簡素化し、削除後(例:通知、ロギングなどを表示)の作業を可能にします。私はほとんどの(すべて?)Javaコレクションがそうしていると思います。

+0

ほとんど/すべてについてすべてのJavaコレクションは同じインターフェースから継承されるため、削除されたオブジェクトを戻す場合はすべてが行います。 –

+1

これは本当に正しいものですが、(私が理解しているように)テストの意図を少し失ってしまいます。 'PersonManager.delete()'が 'Person'インスタンスを返すかどうかテストすることは、' PersonDao.delete() 'を呼び出す場合と同じではありません。 –

+0

'PersonPanager.delete()'は 'boolean'を返すことができます.. –

6

簡単なモックでは、expect()の周囲にvoid関数をラップする必要はありません。あなただけのような何かをする必要があります。

obj = createMock(...) 
obj.someVoidMethod(); 
replay(obj); 
... 
verify(obj); 
0

Mockitoは、メソッドを呼び出すときに戻り値の型がvoidであっても確認できる静的verifyメソッドを提供します。あなたのコードサンプルでは、​​次のmockitoコードが動作するはずです:

// Put this among your import statements  
import static org.mockito.Mockito.* 

class PersonManagerTest { 

    private PersonManager manager; // SUT 

    private Map<String, Person> mockedPersons; 

    private PersonDao mockDao; 

    // Don't forget to setup from scratch for each test 
    @Before public void setup() { 
     mockDao = mock(PersonDao.class); // mockito mock method 
     mockedPersons = new HashMap<String, Person>(); 
     for (int i=1; i<=3; i++) { 
      mockedPersons.put("person"+i, mock(Person.class)); 
     } 
     manager = new PersonManager(mockDao); 
    } 

    // setup dao to return a mocked person 
    private void whenPersonIsAdded(int i) { 
     Person personToReturn = mockedPersons.get("person"+i); 
     when(mockDao.find("person"+i)).thenReturn(personToReturn); 
    } 

    @Test public void shouldReturnExistingPerson() { 
     whenPersonIsAdded(1); 
     Person expectedPerson = mockPerson; 

     Person actualPerson = manager.find("person1"); 

     assertEquals(expectedPerson, actualPerson); 
    } 

    @Test public void shouldDeleteExistingPerson() { 
     String expectedPersonString = "person1"; 

     manager.delete(expectedPersonString); 

     verify(mockDao).delete(expectedPersonString); 
    } 
} 

希望します。