2013-08-14 4 views
0

У меня есть этот код:Mockito исключение: org.mockito.exceptions.misusing.InvalidUseOfMatchersException

import static org.mockito.Mockito.*; 

final Combobox combobox = mock(Combobox.class); 

//.... some business logic which calls method 'appendChild' on 'combobox' 

verify(combobox, times(3)).appendChild((Component) anyObject()); // <<== exception here 

И это пишет все время это:

Invalid use of argument matchers! 
2 matchers expected, 1 recorded. 
This exception may occur if matchers are combined with raw values: 
//incorrect: 
someMethod(anyObject(), "raw String"); 
When using matchers, all arguments have to be provided by matchers. 
For example: 
//correct: 
someMethod(anyObject(), eq("String by matcher")); 
For more info see javadoc for Matchers class. 

метод AppendChild выглядит следующим образом:

public final boolean appendChild(Component child) 
{ 
    return insertBfr(null, child); 
} 
+1

Какая строка бросает исключение? Отправьте свой SSCCE (http://sscce.org/) здесь. –

+0

Есть ли разные версии (с различным количеством аргументов) метода 'appendChild'? Не могли бы вы показать нам код этого метода? – LaurentG

+1

Почему вы используете 'anyObject'? Вместо этого используйте 'any' с вашим классом в родовом формате. Посмотрите, что произойдет. –

ответ

2

appendChild является окончательным методом, что означает you can't mock or verify it. Компилятор Java понимает, что «окончательный» означает, что он может быть уверен в том, какая реализация фактического метода он вызывает, а это означает, что требуется ярлык, чтобы вызвать этот код напрямую, а не позволять Mockito скрываться и заменять реализацию. В общем, это одна из веских причин, по которым люди рекомендуют not to mock types you don't own or control.

Рефакторинг вашего теста или используйте PowerMockito для выполнения магии магического байт-кода, чтобы издеваться над этими окончательными методами.

(Почему это исключение? Matchers actually affect static state in Mockito. Потому что вы называете anyObject на этой линии, Mockito еще registers a Matcher. Это Сличитель соответствует несуществующий аргумент на вашем следующем вызове when или verify, или получает пойманную the Mockito usage validator, если вы используете MockitoJUnitRunner В любом случае, это хороший улов, потому что код не делает то, что вы думаете.)

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