Mam narzędzie wiersza poleceń, które wykonuje sprawdzenie DNS. Jeśli sprawdzenie DNS powiedzie się, polecenie przechodzi do dalszych zadań. Próbuję napisać testy jednostkowe do tego za pomocą Mockito. Oto mój kod:
public class Command() {
// ....
void runCommand() {
// ..
dnsCheck(hostname, new InetAddressFactory());
// ..
// do other stuff after dnsCheck
}
void dnsCheck(String hostname, InetAddressFactory factory) {
// calls to verify hostname
}
}
Używam InetAddressFactory do mockowania statycznej implementacji InetAddress
klasy. Oto kod fabryczny:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
Oto mój przypadek testowy:
@RunWith(MockitoJUnitRunner.class)
public class CmdTest {
// many functional tests for dnsCheck
// here's the piece of code that is failing
// in this test I want to test the rest of the code (i.e. after dnsCheck)
@Test
void testPostDnsCheck() {
final Cmd cmd = spy(new Cmd());
// this line does not work, and it throws the exception below:
// tried using (InetAddressFactory) anyObject()
doNothing().when(cmd).dnsCheck(HOST, any(InetAddressFactory.class));
cmd.runCommand();
}
}
Wyjątek dotyczący przeprowadzania testPostDnsCheck()
testu:
org.mockito.exceptions.misusing.InvalidUseOfMatchersException:
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"));
Masz jakieś uwagi, jak rozwiązać ten problem?
java
unit-testing
mockito
devang
źródło
źródło
Miałem ten sam problem od dłuższego czasu, często potrzebowałem mieszać Matcherów i wartości i nigdy nie udało mi się tego zrobić z Mockito… aż do niedawna! Umieściłem tutaj rozwiązanie, mając nadzieję, że komuś pomoże, nawet jeśli ten post jest dość stary.
Oczywiście nie jest możliwe jednoczesne użycie dopasowań ORAZ wartości w Mockito, ale co by było, gdyby dopasowujący zaakceptował porównanie zmiennej? To rozwiązałoby problem ... i faktycznie jest: eq
W tym przykładzie „metas” to istniejąca lista wartości
źródło
org.mockito.Mockito.eq()
Może to komuś pomóc w przyszłości: Mockito nie obsługuje kpiny z „ostatecznych” metod (w tej chwili). Dało mi to samo
InvalidUseOfMatchersException
.Rozwiązaniem dla mnie było umieszczenie części metody, która nie musiała być „ostateczna”, w oddzielnej, dostępnej i nadającej się do zastąpienia metodzie.
Przejrzyj interfejs API Mockito pod kątem swojego przypadku użycia.
źródło
Pomimo korzystania ze wszystkich dopasowań otrzymałem ten sam problem:
Zajęło mi trochę czasu, zanim zrozumiałem, że metoda, którą próbowałem wyszydzić, była metodą statyczną klasy (powiedzmy Xyz.class), która zawiera tylko metodę statyczną i zapomniałem napisać następujący wiersz:
Być może pomoże to innym, ponieważ może być również przyczyną problemu.
źródło
W moim przypadku wyjątek został zgłoszony, ponieważ próbowałem kpić z
package-access
metody. Kiedy zmienił poziom dostępu z metodypackage
doprotected
wyjątek odszedł. Np. Wewnątrz poniżej klasy Java,metoda
String getName(String id)
musi być na NAJMNIEJSZYMprotected
poziomie, aby mechanizm kpiny (podklasy) działał.źródło