Java JMock-没有期望的对象

Java JMock-没有期望的对象,java,junit,junit4,jmock,Java,Junit,Junit4,Jmock,我在用junt和jock。 假设我有一个对象的接口,Contact,在我的测试类中有一个这样的方法: @Test public void testAddOneContact() { final Contact contact = this.context.mock(Contact.class); this.addressBook.addContact(contact); assertTrue("Object added to list", this.addressBo

我在用junt和jock。 假设我有一个对象的接口,
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的正确方法吗(所以即使我没有任何期望)?

我将尝试一下这一点:

首先,我不认为你写测试的方式有任何错误

根据测试用例描述,我假设测试用例用于存储联系人列表的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);
}
现在,TestAddOnContact的测试代码必须测试两个不同的输入案例,这可以使用两个单独的测试案例按如下方式完成

@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()
这样的某些方法需要如何重写。这也让你想到-‘我如何处理错误案例?’。这些深思熟虑的问题对于确保您所发布的代码能够以高效且无错误的方式准确地解决它应该解决的问题至关重要

希望这有帮助