Mockito:模拟对象并添加到 ArrayList

shi*_*uno 3 java junit mockito

我正在使用 Mockito 和 JUnit 测试企业级应用程序。这是将产品添加到我拥有的产品 offline-repository-class-test 中的离线存储库类的方法的代码:

@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);
}
Run Code Online (Sandbox Code Playgroud)

这依赖于类中的以下方法:

它正在测试的方法ProductRepositoryOffline

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

}
Run Code Online (Sandbox Code Playgroud)

初始数据

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

public void addProduct(Product product) {
    products.add(product);
}
Run Code Online (Sandbox Code Playgroud)

我想问的问题是,pro.persistProduct(product)除非我已经将产品添加到ArrayList,否则不persistProduct打算将产品添加到 arrayList 而不需要评论productList.add(product)

Dra*_*ken 5

这是你应该做的:

@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);
}
Run Code Online (Sandbox Code Playgroud)

因为对象initialData是模拟的,所以当它调用initialData.addProduct(pr);your 中的方法时ProductRepositoryOffline,它什么都不做。您必须手动将其添加到列表中,以便稍后在您的assertEquals(). 要确认该方法已被调用,您可以使用该verify()方法检查是否addProduct()使用product您创建的对象在模拟对象上调用了一次。你可以在这里看到更多的例子verify()

还有其他方法可以模拟 void 方法,例如您对 的使用addProduct(),要查看其中的一些示例,请在此处查看此问题

[编辑] 你可以做的另一个变化是使用doAnswer(),它看起来像这样:

Mockito.doAnswer(productList.add(product)).when(initialData).addProduct(product);
Run Code Online (Sandbox Code Playgroud)

我不是 100% 这会起作用,因为我从未使用过它,但我相信在initialData.addProduct(product);调用这一点时,该产品将被添加到您的产品列表中。这样你就不需要使用productList.add(product);有点帮助的希望了!