В Mockito 1.9.5 я хотел бы отформатировать фактическое значение при verify
аргументов (в порядке) вызова метода.
Mockito предоставляет метод overridable describeTo
в ArcgumentMatcher<T>
который позволяет мне форматировать ожидаемое значение. Когда насмехают классы JRE, такие как DatagramPacket
используя PowerMockito whenNew
, фактическое значение не форматируется так, как мне нравится.
В следующем примере мне интересно, только если адрес DatagramPacket
был вызван по порядку. Если нет, я бы хотел увидеть несовпадение, фактическое значение, а не значение по умолчанию toString()
" java.net.DatagramPacket@7546a399
".
Мой пользовательский соединитель способен сопоставлять только InetSocketAddress
.
Пользовательский соединитель:
static class IsDatagramForAddress extends ArgumentMatcher<DatagramPacket> {
final InetSocketAddress addr;
public IsDatagramForAddress(InetSocketAddress addr){
this.addr = addr;
}
public boolean matches(Object dgp) {
SocketAddress isa = ((DatagramPacket) dgp).getSocketAddress();
boolean eq = isa.equals(addr);
// System.out.println(dgp + ": " + isa + "< >" + addr + " == " + eq);
return eq;
}
@Override
public void describeTo(Description description) {
description.appendText(addr == null ? null : addr.toString());
}
}
Тест:
private static DatagramPacket isDatagramForAddress(InetSocketAddress addr){
return argThat(new IsDatagramForAddress(addr));
}
...
@Test
public void testSendIsCalledWithServersInOrder() throws Exception {
InOrder order = inOrder(sock);
order.verify(sock).send(isDatagramForAddress(new InetSocketAddress("8.8.8.2", 100)));
order.verify(sock).send(isDatagramForAddress(new InetSocketAddress("8.8.8.1", 100)));
}
Это то, что я получаю:
org.mockito.exceptions.verification.VerificationInOrderFailure:
Verification in order failure
Wanted but not invoked:
datagramSocket.send(/8.8.8.1:100);
-> at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:95)
Wanted anywhere AFTER following interaction:
datagramSocket.send(
java.net.DatagramPacket@7546a399
);
-> at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:90)
at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:95)
...
Это то, чего я ожидаю:
org.mockito.exceptions.verification.VerificationInOrderFailure:
Verification in order failure
Wanted but not invoked:
datagramSocket.send(/8.8.8.1:100);
-> at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:95)
Wanted anywhere AFTER following interaction:
datagramSocket.send(/8.8.8.2:100);
-> at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:90)
at xxxx.XxxxTest.testSendIsCalledWithServersInOrder(XxxxTest.java:95)
...
Как я могу форматировать /toString()
фактическое значение?
Вы можете сделать свой ArgumentMatcher
последним объектом, который был передан ему, затем включить его в свой метод describeTo
. Это может выглядеть примерно так.
static class IsDatagramForAddress extends ArgumentMatcher<DatagramPacket> {
final InetSocketAddress addr;
DatagramPacket lastCompared;
public IsDatagramForAddress(InetSocketAddress addr){
this.addr = addr;
}
public boolean matches(Object dgp) {
if (dgp instanceof DatagramPacket) {
lastCompared = (DatagramPacket) dgp;
SocketAddress isa = lastCompared.getSocketAddress();
return isa.equals(addr);
}
return false;
}
@Override
public void describeTo(Description description) {
description.appendText(addr == null ? null : addr.toString());
if (lastCompared != null) {
description.appendText("Last socket address was " + lastCompared.getSocketAddress());
}
}
}