2014-10-28 4 views
0

У меня есть класс А, который должен сделать два последующих вызовов метода его зависимостей B, который принимает коллекцию в качестве аргумента:Проверка аргументов последующих вызовов того же метода в Mockito

class A{ 
    private B myDependency; 

    public myClassMethod() { 
    // ... on more than one occasion calls myDependency.dependencyMehtod(someColleciton); 
    } 
} 

class B{ 
    public void dependencyMehtod(Collection<Something> input) 
} 

I хотел бы написать единичный тест для класса A (предпочтительно с использованием Mockito), который проверяет, что метод зависимостей вызывается точно заданным количеством раз, а также проверяет размер входной коллекции при каждом последующем вызове (размер аргумента варьируется между вызовами). Как я могу это сделать?

Я попытался с помощью

myAObject.myClassMethod(); 

verify(myMockOfB).dependencyMehtod((Collection<Something>) argThat(hasSize(3)); //I expect a size of 3 on the first call 
verify(myMockOfB).dependencyMehtod((Collection<Something>) argThat(hasSize(1)); //I expect a size of 1 on the second call 

Однако я получаю сообщение об ошибке от Mockito, что коллекция размера 1 была найдена где ожидается коллекция размера 3. Что я делаю не так?

+0

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#6. Почти все о Mockito описано на этой странице с примерами и всего. Прочтите все. –

+0

Выглядит как обманутый вопрос: http://stackoverflow.com/questions/36573399/how-to-verify-invocations-of-the-same-mock-method-with- the-same-argument- thatat -ch – Hedley

ответ

1

Вы можете использовать ArgumentCaptor. Вот пример:

@Captor 
private ArgumentCaptor<Collection<Something>> valuesArgument; 

/* 
... 
*/ 

@Test 
public void test() { 
    /* 
    ... 
    */ 

    // verify the number of calls 
    verify(myMockOfB, times(2)).dependencyMehtod(valuesArgument.capture()); 

    // first call 
    assertEquals(3, valuesArgument.getAllValues().get(0).size()); 

    // second call 
    assertEquals(1, valuesArgument.getAllValues().get(1).size()); 
} 
+0

Хорошо, но есть проблема: если я продолжаю передавать одну и ту же коллекцию методу при каждом вызове, у меня будет только последнее состояние в аргументе. В принципе, он просто сохраняет ссылку на объект аргумента, он ничего не сообщает о состоянии этого объекта во время вызова метода. И содержимое Коллекций, как правило, со временем меняются :) –

+0

Вы правы. Это работает только с отдельными коллекциями. Я не учитывал несколько вызовов с одной и той же коллекцией. – Khalid

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