Mockito 1.9: отформатировать ожидаемое значение (например, «фактический форматер» в пользовательском ArgumentMatcher)

1

В 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() фактическое значение?

Теги:
powermock
mockito
formatting
matcher

1 ответ

3

Вы можете сделать свой 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());
        }
    }
}
  • 0
    Интересный и прагматичный подход. +1 за это. Но вы не получите чек, потому что я надеялся, что есть готовое решение. Недостатком этого является то, что разработчики, не знакомые с этим решением, могут быть смущены выводом, и он может сообщать о средствах (хотя в данном случае это не имеет значения для меня :).
  • 1
    Таким образом, вы примете ответ на свой вопрос, только если команда Mockito разработает для вас новую функцию?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню