2013-11-03 47 views
1

我想測試makeBooks()方法返回一個Mockito對象。 因此,測試將檢查它是否返回圖書對象。我怎麼做?測試一個返回帶Mockito對象的方法

以下是我的工廠生產書籍。這門課下面是我的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); 
    } 
} 
+0

它看起來不像'ItemFactory'會編譯。 – Jonathan

回答

0

使運行makeBooks()檢查看Books對象的值是否爲空,看看它實際上是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; 
} 
+0

真的是一個聰明的解決方法。但是,爲什麼要創建另一種方法,當有方法用Mockito測試原始方法時返回true或false。我希望有關於如何使用Mockito的很好的教程。 –

+0

我可以用JUnit使用資產等進行測試......但我正在學習使用Mockito –

+0

是的我對Mockito不太熟悉,所以我試圖爲您提供另一種解決方法,如果您不是能夠找到任何東西。希望這可以幫助! – Omicron

3

你不應該嘲笑正在測試的類。你必須嘲笑正在測試的類/方法正在使用的類。模擬Itemsfactory.makeBooks()

如果有一個BookFactory是ItemsFactory用來製作書籍的,那麼您可以嘲笑BookFactory返回您期望的特定Book /一組書籍。然後你可以斷言

+0

像這樣的東西? –

+0

ItemFactory factory = Mockito.mock(ItemFactory.class); \t \t Books b = factory.makeBooks(「Hamlet」,「ShakeSpear」,123456,9); (b.getClass()。getName()。equals(「LibraryItems.Books」));}}; –

0

正如已經解釋過的,你不應該嘲笑你正在測試的類。如果Book是一個POJO,那麼不需要模擬任何東西,只需要聲明已創建的Book對象已正確填充。當有一個更簡單的選擇時,爲什麼會使生活複雜化,只有在絕對必要時才模仿對象。

我明白你正在學習Mockito,我認爲理解何時以及如何模擬也是朝正確方向邁出的一步。

您可能會收到錯誤消息,因爲Mockito不支持模擬靜態方法。 Powermock擴展添加了對靜態方法,構造函數,私有方法等的支持。

舉個例子,最好的地方是項目站點上的examples and documentation部分。

0

我建議使用PowerMockito(用於靜態方法模擬)與Mockito與Junit(用於Asserts)。我將爲您的課程編寫一個測試類(例如,CUT,ItemFactory),但您的ItemFactory類不可編譯。

你會修復你的ItemFactory類,我會告訴你如何使用PowerMockito與Mockito進行測試。