У меня есть инструмент командной строки, который выполняет проверку DNS. Если проверка DNS прошла успешно, команда переходит к дальнейшим задачам. Я пытаюсь написать для этого модульные тесты с помощью Mockito. Вот мой код:
public class Command() {
// ....
void runCommand() {
// ..
dnsCheck(hostname, new InetAddressFactory());
// ..
// do other stuff after dnsCheck
}
void dnsCheck(String hostname, InetAddressFactory factory) {
// calls to verify hostname
}
}
Я использую InetAddressFactory, чтобы имитировать статическую реализацию InetAddress
класса. Вот код фабрики:
public class InetAddressFactory {
public InetAddress getByName(String host) throws UnknownHostException {
return InetAddress.getByName(host);
}
}
Вот мой пример модульного теста:
@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();
}
}
Исключение при выполнении testPostDnsCheck()
теста:
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"));
Любые данные о том, как решить эту проблему?
java
unit-testing
mockito
деванг
источник
источник
У меня уже долгое время была одна и та же проблема, мне часто приходилось смешивать сопоставители и значения, и мне никогда не удавалось сделать это с Mockito .... до недавнего времени! Я поместил решение здесь в надежде, что оно кому-то поможет, даже если этот пост довольно старый.
Очевидно, что в Mockito невозможно использовать Matcher AND значения вместе, но что, если есть Matcher, принимающий сравнение переменной? Это решило бы проблему ... а на самом деле есть: eq
В этом примере «метас» - это существующий список значений.
источник
org.mockito.Mockito.eq()
Это может помочь кому-то в будущем: Mockito не поддерживает насмешку над «финальными» методами (прямо сейчас). Это дало мне то же самое
InvalidUseOfMatchersException
.Решение для меня заключалось в том, чтобы поместить часть метода, которая не должна быть «окончательной», в отдельный, доступный и переопределяемый метод.
Просмотрите API Mockito для вашего варианта использования.
источник
Несмотря на использование всех сопоставителей, у меня возникла та же проблема:
"org.mockito.exceptions.misusing.InvalidUseOfMatchersException: Invalid use of argument matchers! 1 matchers expected, 3 recorded:"
Мне потребовалось немного времени, чтобы понять, что метод, который я пытался имитировать, был статическим методом класса (скажем, Xyz.class), который содержит только статический метод, и я забыл написать следующую строку:
Возможно, это поможет другим, так как это также может быть причиной проблемы.
источник
В моем случае исключение было вызвано тем, что я пытался имитировать
package-access
метод. Когда я изменил уровень доступа к методу изpackage
кprotected
исключению ушло. Например, внутри класса Java,public class Foo { String getName(String id) { return mMap.get(id); } }
метод
String getName(String id)
должен быть МИНИМУМprotected
уровня, чтобы мог работать механизм насмешек (подклассы).источник
Не используйте Mockito.anyXXXX (). Непосредственно передайте значение параметру метода того же типа. Пример:
A expected = new A(10); String firstId = "10w"; String secondId = "20s"; String product = "Test"; String type = "type2"; Mockito.when(service.getTestData(firstId, secondId, product,type)).thenReturn(expected); public class A{ int a ; public A(int a) { this.a = a; } }
источник