2016-05-17 87 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