代码之家  ›  专栏  ›  技术社区  ›  Fabrizio Duroni

JMock-没有预期的对象

  •  0
  • Fabrizio Duroni  · 技术社区  · 11 年前

    我在用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);
        }
    }
    

    所以您可以看到,我没有调用 联系 界面 因此,我对测试方法没有任何期望 testAddOneContact() . 这是实现测试用例和使用JMock的正确方法吗(所以即使我没有任何期望)?

    1 回复  |  直到 11 年前
        1
  •  1
  •   Prahalad Deshpande    11 年前

    我将尝试一下:。

    首先,我看不出你写测试的方式有什么不正确的地方。

    根据测试用例描述,我假设测试用例用于 通讯簿 类,该类存储联系人列表,并且您正在测试该方法 添加联系人 暴露于 通讯簿

    也就是说,你仍然可以通过在 添加联系人 方法:

    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);
    }
    

    现在您的测试代码 测试添加一个联系人 必须测试两个不同的输入案例,这可以使用两个单独的测试案例如下所述

    @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() 需要重写。这也会让你思考——“我该如何处理错误案例?”。这些深思熟虑的问题对于确保您所发送的代码准确地解决本应以高效且无错误的方式解决的问题至关重要。

    希望这能有所帮助