Убедитесь, что один из трех методов вызывается с mockito - PullRequest
11 голосов
/ 08 апреля 2011

У меня есть три метода, подобных этим:

public void method1(String str){
    ...
}

public void method1(String str, String str2, String str3){
    ...
}

public void method1(String str, String str2, Object[] objs, String str3){
    ...
}

Я хочу проверить в Mockito, вызывается ли какой-либо из этих методов, поэтому я попытался использовать anyVararg Matcher:

verify(foo).method1(anyVararg());

но это не компилируется "Метод method1 (String, String) в типе Errors не применим для аргументов (Object)"

У меня два вопроса:

  1. Как я могу решить это?
  2. Есть ли способ проверить, вызывается ли какой-либо из двух методов? Представьте, что у меня есть еще один метод, называемый method2 и method3. Я хотел бы проверить, вызван ли какой-либо из них (но хотя бы один).

Спасибо.

Ответы [ 3 ]

8 голосов
/ 09 апреля 2011

Вы можете сделать это, используя Answer для увеличения счетчика, если вызывается какой-либо из методов.

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        counter++;
        return null;
    }        
};

Обратите внимание, что вам нужно заглушить все методы. Уникальность метода основана на его сигнатуре, а не только на имени метода. Два метода с одинаковым именем по-прежнему являются двумя разными методами.

doAnswer(incrementCounter).when(mockObj.method1(anyString()));
doAnswer(incrementCounter).when(mockObj.method1(anyString(), anyString()));
doAnswer(incrementCounter).when(mockObj.method2(anyString()));

См. Документацию для doAnswer здесь .

2 голосов
/ 08 апреля 2011

Метод vararg имеет такую ​​подпись:

public void myMethod(String ... arguments){}

Ни один из ваших методов не является методом vararg.

Я не знаю Mockito, поэтому я не могу решить вашу проблему за вас, но нет возможности абстрагироваться от всех трех вышеперечисленных методов, если вы не используете отражение, поэтому я думаю, вам придется использовать отдельные случаи для каждого из вышеперечисленных методов.

0 голосов
/ 12 сентября 2014

Вы можете перехватить все вызовы на объекте, как в этом ответе: Mockito - перехватить любой вызов метода на макете и затем объедините это с подходом, предложенным @Bozho:

private Answer incrementCounter = new Answer() {
    public Object answer(InvocationOnMock invocation) throws Throwable {
        if (invocation.getMethod().getName().eqauls("someMethid")) {
            counter++;
        }
        return null;
    }        
};

VendorObject mockObj = mock(SomeClass.class, incrementCounter);

Примечание: если вы предоставите другой перехватчик для любого из этих методов - по умолчанию вызываться не будет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...