2

我想makeBooks()用 Mockito 测试返回 book 对象的方法。所以测试将检查它是否返回书籍对象。我怎么做?

下面是我生产书籍的工厂。该课程下方是我的 Mockito 测试课程。我收到一个错误代码,上面写着“我误用了 Mockito”

顺便说一句,我正在学习 Mockito。这既不是家庭作业,也不是作业。

public class ItemFactory {
    public Items getItems(String itemType)
    {      
        public static Books makeBooks(String bookName,String authorName, int ISBN, int id)
        {
            Books book = new Books(bookName, authorName, ISBN, id);
            return book;
        }
    }
}

public class TestItemFactory {
    private static final Books books = null;
    private static ItemFactory mockItemFactory;

    @BeforeClass
    public static void setUpBeforeClass() throws Exception {
        mockItemFactory = Mockito.mock(ItemFactory.class);
    }

    @Test
    public void testShouldReturnObjectBooks(){
        //ItemFactory methodMakeBooks = Mockito.mock(ItemFactory.class) ;
        //Books book = null;// = ItemFactory.makeBooks("Hamlet", "ShakeSpear", 123456, 9);
        //final Class<?> bookClass = Books.class;
        //Mockito.when(methodMakeBooks.makeBooks(null, null, 0, 0)).thenReturn(book);
        Books book = null;

        mockItemFactory = Mockito.spy(new ItemFactory());
        Books mockBook = Mockito.mock(Books.class);
        Mockito.when(mockItemFactory.makeBooks(null, null, 0, 0)).thenReturn(book);
        //Mockito.doReturn(mockBook).when(mockItemFactory).makeBooks(null, null, 0, 0);
    }
}
4

4 回答 4

3

您不应该嘲笑正在测试的课程。您必须模拟您正在测试的类/方法正在使用的类。模拟 Itemsfactory.makeBooks() 没有意义

如果 ItemsFactory 有一个 Bookfactory 用来制作书籍,那么您可以模拟 BookFactory 以返回您期望的特定书籍/书籍集。然后你可以断言

于 2013-11-03T06:50:21.450 回答
0

创建一个实用程序方法makeBooks()来检查Books对象的值是否为 null 并查看它是否实际上是 type Books

public boolean test(String bookName, String authorName, int ISBN, int id)
{
    // Check to see if the object being returned is not null
    if (ItemFactory.makeBooks(bookName, authorName, ISBN, id) != null)
    {
        // Check to see if object being returned is of type Books
        if (ItemFactory.makeBooks(bookName, authorName, ISBN, id) instanceof Books)
        {
            return true;
        }

        return false;
    }

    return false;
}
于 2013-11-03T03:00:23.540 回答
0

正如已经解释过的,您不应该模拟您正在测试的课程。如果 Book 是 POJO,则无需模拟任何内容,您只需断言创建的 Book 对象已正确填充。当有一个更简单的替代方案时,为什么要让生活复杂化,只有在绝对必要时才模拟对象。

我了解您正在学习 Mockito,并且我认为了解何时以及模拟什么也是朝着正确方向迈出的一步。

您可能会收到错误消息,因为 Mockito 不支持模拟静态方法。Powermock扩展增加了对静态方法、构造函数、私有方法等的支持

至于示例,最好的起点是项目站点上托管的示例和文档部分。

于 2013-11-04T09:40:11.807 回答
0

我建议使用 PowerMockito(用于静态方法模拟)和 Mockito 和 Junit(用于 Asserts)。我打算为您的测试类(例如,CUT、ItemFactory)编写一个品尝类,但您的 ItemFactory 类不可编译。

你会修复你的 ItemFactory 类吗,我将向你展示如何使用 PowerMockito 和 Mockito 来测试它。

于 2013-11-07T20:46:39.957 回答