0

ジャントとジョックを使っています。Contactテスト クラスに、次のようなオブジェクトのインターフェイス、およびメソッドがあるとします。

@Test
public void testAddOneContact() {
    final Contact contact = this.context.mock(Contact.class);

    this.addressBook.addContact(contact);

    assertTrue("Object added to list", this.addressBook.getNumberOfContacts() == 1);        
} 

メソッドaddContactは次のように実装されます。

public void addContact(Contact contact) {

    //Check if contact passed is valid. If it is, add it to address book
    if(contact != null) {
        this.contactsList.add(contact);
    }
}

Contactしたがって、インターフェイスのメソッドを呼び出していないことがわかります。このため、テスト方法には期待できませんtestAddOneContact()。これは、テスト ケースを実装して JMock を使用する正しい方法ですか?

4

1 に答える 1

1

私はこれを撃ちます:。

まず、あなたがテストを書いた方法に間違いはありません。

テスト ケースの説明に基づいて、このテスト ケースは連絡先のリストを格納するAddressBookクラス用であり、 AddressBookクラスによって公開されるメソッドaddContactをテストしていると仮定します。

ただし、 addContactメソッドで以下のようなことを行うことで、クラスをもう少し堅牢にすることができます。

public void addContact(Contact contact) throws IllegalArgumentException
{
    if(contact == null)
    {
           //throw an exception after logging that contact is null
           throw new IllegalArgumentException("Passed in contact cannot be null!!")
    }
    this.contactsList.add(contact);
}

testAddOneContactのテスト コードは、2 つの異なる入力ケースをテストする必要があります。これは、2 つの別々のテスト ケースを使用して以下のように実行できます。

@Test
public void testAddOneContact() {
    final Contact contact = this.context.mock(Contact.class);

    this.addressBook.addContact(contact);

    assertTrue("Object added to list", this.addressBook.getNumberOfContacts() == 1);  

    //assuming that Contact class implements the equals() method you can test that the contact
    //added is indeed the one that you passed in
    assertTrue(addressBook.get(0).equals(contact));      
}



//the below test ensures that there is exception handling mechanism within your library code
@Test
@Expected(IllegalArgumentException.class)
public void testShouldThrowWhenContactIsNull()
{
    this.addressBook.addContact(null);
}

余談ですが、優れたテスト クラスを実装すると、API として公開されるメソッドの設計と、特定のメソッドがどのようにオーバーライドされ、オーバーライドされる必要があるかについて考えるようになることに注意してhashCodeくださいequals()。また、「エラー ケースをどのように処理すればよいか」ということも考えさせられます。このような思慮深い質問は、出荷するコードが、解決すべき問題を効率的かつエラーのない方法で正確に解決するために不可欠です。

お役に立てれば

于 2013-10-27T15:57:26.833 に答える