2016-05-17 88 views
0

我正在使用Mockito和JUnit測試企業級應用程序。這裏是一種用於在產品的離線的倉庫級測試將產品添加到脫機存儲庫類的方法我的代碼:Mockito:嘲笑對象並添加到ArrayList

@Mock 
private InitialData initialData; 

@InjectMocks 
private ProductRepositoryOffline pro; 

@Test 
public void testPersistProduct() { 
    Product product = new Product(0, "", "", "", 0.0, true, "", 0, /*Product type*/null, "", 0, 0); 
    ArrayList<Product> productList = new ArrayList<Product>();  
    //productList.add(product); 

    Mockito.when(initialData.getProducts()).thenReturn(productList); 
    pro.persistProduct(product); 
    assertEquals(pro.getProducts().get(0), product); 
} 

這依賴於在類以下方法:

的方法是測試在ProductRepositoryOffline

@Override 
public void persistProduct(Product pr) { 
    initialData.addProduct(pr); 

} 

InitialData

private ArrayList<Product> products = new ArrayList<Product>(); 

public void addProduct(Product product) { 
    products.add(product); 
} 

我想問的問題是,在pro.persistProduct(product)的情況下,除非我已將產品添加到ArrayList,而不是persistProduct意味着將產品添加到arrayList,而不需要評論productList.add(product)

+0

您只聲明'initialData'的模擬在'getProducts'方法中做了什麼,我假定'ProductRepositoryOffline'調用'getProducts()'的版本。 'initialData.addProduct(pr)'應該做些什麼?目前,它什麼也沒有做 – Draken

+0

問題是,當調用一個方法時,你不能定義Mockito來添加一個對象到一個特定的列表中,它不會以這種方式工作。所以除非你做'productList.add(product);','product'的項目永遠不會被添加到列表中。 – Draken

回答

3

這裏是你應該做的事情:

@Mock 
private InitialData initialData; 

@InjectMocks 
private ProductRepositoryOffline pro; 

@Test 
public void testPersistProduct() { 
    Product product = new Product(0, "", "", "", 0.0, true, "", 0, 
     /*Product type*/null, "", 0, 0); 
    ArrayList<Product> productList = new ArrayList<Product>();  
    productList.add(product); 

    Mockito.when(initialData.getProducts()).thenReturn(productList); 
    pro.persistProduct(product); 
    assertEquals(pro.getProducts().get(0), product); 
    Mockito.verify(initialData).addProduct(product); 
} 

因爲對象initialData被嘲笑,當它調用的方法initialData.addProduct(pr);ProductRepositoryOffline,它什麼都不做。您必須手動將其添加到列表中以便稍後在assertEquals()中檢查。要確認方法已被調用,可以使用verify()方法檢查addProduct()是否在您的模擬對象上使用您創建的對象product調用過。你可以看到更多的例子verify()here

還有其他的方法來嘲笑void的方法,比如你的addProduct()使用情況,看到這些的一些例子,看到了這個問題here

[編輯] 另一個變化你可以做的是使用doAnswer(),這將是這個樣子:

Mockito.doAnswer(productList.add(product)).when(initialData).addProduct(product); 

我不是100%,這將工作,因爲我從來沒有使用過它,但我相信在調用initialData.addProduct(product);時,產品將被添加到您的產品列表中。這樣你就不需要使用productList.add(product);希望有一點幫助!

+1

謝謝,我也會檢查編輯過的版本。 – shirafuno