我正在使用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的正确方法(所以即使我没有任何期望)?
答案 0 :(得分:1)
我会对此有所了解:。
首先,我没有看到你编写测试的方式有任何不正确之处。
根据测试用例说明,我假设测试用例是针对 AddressBook 类,它存储了一个联系人列表,并且您正在测试方法 addContact AddressBook 类。
那说你仍然可以通过在 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 的测试代码必须测试两个不同的输入案例,这可以使用两个单独的测试用例完成,如下所示
@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()
)。它还会让你思考 - 我该如何处理错误案例?'。这些深思熟虑的问题对于确保您发布的代码能够有效解决它应该以有效和无错误的方式解决的问题至关重要。
希望这有帮助