Получить / сохранить параметры для ожидаемого вызова метода JMock? - PullRequest
0 голосов
/ 05 января 2009

Я хочу протестировать объект «Адаптер», который при получении сообщения XML, он переваривает его в объект Message, помещает идентификатор сообщения + CorrelationID оба с метками времени и пересылает его клиентскому объекту. Сообщение может быть связано с предыдущим (например, m2.correlationID = 3D m1.ID).

Я высмеиваю Клиента и проверяю, что Адаптер успешно звонит "client.forwardMessage (m)" дважды с первым сообщением с нулем correlationID и секунда с ненулевым корреляционным идентификатором.

Тем не менее, я хотел бы точно проверить, что корреляционные идентификаторы установлены правильно, захватывая идентификаторы (например, m1.ID).

Но я так и не смог найти.

Существует jira о добавлении функции, но никто не прокомментировал и это не назначен.

Это действительно не реализовано?

Я читал об альтернативе перепроектирования Адаптера для использования IdGenerator объект, который я могу заглушки, но я думаю, что будет слишком много объекты. = 20 Разве вы не думаете, что это добавляет ненужную сложность для разделения объектов так мелкая зернистость?

Спасибо, и я ценю любые комментарии: -)

Tayeb

Ответы [ 2 ]

1 голос
/ 10 мая 2009

Вы можете использовать средство сопоставления (http://code.google.com/p/hamcrest), чтобы проверить, переданы ли в ваш метод правильные аргументы. Обратите внимание, что вам нужно статически импортировать сопоставление (в моем примере HasCorrelationId).

В приведенном ниже примере утверждается, что client.forwardMessage (m) вызывается один раз с сообщением с null correlationId и один раз с сообщением с correlationId = "abc".

import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;

public class HasCorrelationId extends TypeSafeMatcher<Message> {
    private final Object expectedCorrelationId;
    public HasCorrelationId(Object expectedCorrelationId) {
        this.expectedCorrelationId = expectedCorrelationId;
    }
    @Override
    public boolean matchesSafely(Message message) {
        if (expectedCorrelationId==message.getCorrelationId()) return true;
        return expectedCorrelationId==null? false: expectedCorrelationId.equals(message.getCorrelationId());

    }

    public void describeTo(Description description) {
        description.appendText("hasCorrelationId("+expectedCorrelationId+")");

    }

    public static HasCorrelationId hasCorrelationId(Object correlationId) {    
    return new HasCorrelationId(correlationId);
    }
}

... и теперь для теста:

public class MyTest {
    private Mockery context = new Mockery();

  @Test
  public void testCorrelationId() {
    final Client client = context.mock(Client.class);
    final Message message1 = context.mock(Message.class,"message1");
    final Message message2 = context.mock(Message.class,"message2");

    context.checking(new Expectations(){{
        allowing(message1).getCorrelationId();will(returnValue(null));
        allowing(message2).getCorrelationId();will(returnValue("abc"));

        one(client).forwardMessage(with(hasCorrelationId(null)));
        one(client).forwardMessage(with(hasCorrelationId("abc")));
    }});

    client.forwardMessage(message1);
    client.forwardMessage(message2);
    }

}
0 голосов
/ 21 мая 2009

Мы приложили некоторые усилия, чтобы упростить написание соответствий в Hamcrest 1.2. Существует новый FeatureMatcher, который требует меньше работы.

...