测试使用Mockito返回Object的方法

时间:2013-11-03 00:15:44

标签: java unit-testing mockito

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

以下是我的工厂生产书籍。那个班级下面是我的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 个答案:

答案 0 :(得分:3)

你不应该嘲笑正在测试的班级。您必须模拟您正在测试的类/方法正在使用的类。模拟Itemsfactory.makeBooks()

是没有意义的

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

答案 1 :(得分:0)

创建一个运行makeBooks()的实用程序方法,以检查Books对象的值是否为null,并查看它是否实际上是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;
}

答案 2 :(得分:0)

正如已经解释的那样,你不应该嘲笑你正在测试的课程。如果Book是POJO,那么就不需要模拟任何东西,只需要声明已经正确填充了创建的Book对象。为什么在有更简单的替代方案时会使生活变得复杂,只有在绝对必要时才会模拟对象。

我知道你正在学习Mockito,我认为理解何时以及何种模仿也是朝着正确方向迈出的一步。

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

至于示例,最好的起点是项目网站上托管的examples and documentation部分。

答案 3 :(得分:0)

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

您是否会修复您的ItemFactory类,我将向您展示如何使用PowerMockito和Mockito进行测试。