2016-05-17 3 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, предназначенным для добавления продукта в массивList без комментариев для комментариев productList.add(product)?

+0

Вы только объявили, что ложь 'initialData' делает в методе' getProducts', который я предполагаю, что 'ProductRepositoryOffline' вызывает в своей версии' getProducts() '. Что должно делать 'initialData.addProduct (pr)' do? На данный момент ничего не делает – 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

Есть другие способы поиздеваться недействительные методы, как ваше использование addProduct(), чтобы увидеть некоторые примеры тех, увидеть этот вопрос here

[EDIT] Другой вариант вы могли бы сделать, это использовать doAnswer(), который будет выглядеть примерно так:

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

Я не 100% это будет работать, так как я никогда не использовал его, но Я считаю, что в точке initialData.addProduct(product); вызывается, тогда продукт будет добавлен в ваш список продуктов. Таким образом вам не нужно будет использовать productList.add(product); Надеюсь, что это поможет!

+1

Спасибо, я также проверю отредактированную версию. – shirafuno

Смежные вопросы