Используя jmock, как повторно использовать параметр - PullRequest
0 голосов
/ 26 мая 2010

Я строю тест, в котором мне нужно отправить вопрос и ждать ответа. Передача сообщений не является проблемой. На самом деле, чтобы выяснить, какой ответ соответствует какому вопросу, я использую идентификатор. Мой идентификатор генерируется с использованием UUID. Я хочу получить этот идентификатор, который задается в качестве параметра для смоделированного объекта. Это выглядит так:

  oneOf(message).setJMSCorrelationID(with(correlationId));
           inSequence(sequence);

Где correlationId - строка, которую я хотел бы сохранить для другого ожидания, подобного этому:

   oneOf(session).createBrowser(with(inputChannel), 
           with("JMSType ='pong' AND JMSCorrelationId = '"+correlationId+"'"));

у тебя есть ответ?

Ответы [ 3 ]

4 голосов
/ 26 мая 2010

Вы должны создавать свои собственные действия. Вот мой:

/**
 * puts the parameter array as elements in the list
 * @param parameters A mutable list, will be cleared when the Action is invoked.
 */
public static Action captureParameters(final List<Object> parameters) {
    return new CustomAction("captures parameters") {
        public Object invoke(Invocation invocation) throws Throwable {
            parameters.clear();
            parameters.addAll(Arrays.asList(invocation.getParametersAsArray()));
            return null;
        }
    };
}

Затем вы используете его следующим образом (со статическим импортом):

    final List<Object> parameters = new ArrayList<Object>();
    final SomeInterface services = context.mock(SomeInterface.class);
    context.checking(new Expectations() {{
        oneOf(services).createNew(with(6420), with(aNonNull(TransactionAttributes.class)));
            will(doAll(captureParameters(parameters), returnValue(true)));
    }});

Чтобы делать то, что вы хотите, вы должны реализовать свой собственный механизм сопоставления. Это то, что я взломал (некоторые нулевые проверки не включены, и, конечно, я просто использую хорошо известные интерфейсы для примера):

 @RunWith(JMock.class)
 public class Scrap {

private Mockery context = new JUnit4Mockery();

@Test
public void testCaptureParameters() throws Exception {
    final CharSequence mock = context.mock(CharSequence.class);
    final ResultSet rs  = context.mock(ResultSet.class);
    final List<Object> parameters = new ArrayList<Object>();
    context.checking(new Expectations(){{
        oneOf(mock).charAt(10);
            will(doAll(JMockActions.captureParameters(parameters), returnValue((char) 0)));
        oneOf(rs).getInt(with(new ParameterMatcher<Integer>(parameters, 0)));
    }});

    mock.charAt(10);
    rs.getInt(10);
}

private static class ParameterMatcher<T> extends BaseMatcher<T> {
    private List<?> parameters;
    private int index;

    private ParameterMatcher(List<?> parameters, int index) {
        this.parameters = parameters;
        this.index = index;
    }

    public boolean matches(Object item) {
        return item.equals(parameters.get(index));
    }

    public void describeTo(Description description) {
        description.appendValue(parameters.get(index));
    }
}
}
0 голосов
/ 29 мая 2010

Еще один вариант для рассмотрения, откуда берется идентификатор корреляции?Нужно ли вводить это действие, чтобы вы могли контролировать его и проверять в тесте?

0 голосов
/ 26 мая 2010

я нашел другое решение на этом сайте http://www.symphonious.net/2010/03/09/returning-parameters-in-jmock-2/

import org.hamcrest.*;
 import org.jmock.api.*;

 public class CapturingMatcher<T> extends BaseMatcher<T> implements Action {
public T captured;

public boolean matches(Object o) {
    try {
        captured = (T)o;
        return true;
    } catch (ClassCastException e) {
        return false;
    }
}

public void describeTo(Description description) {
    description.appendText("captured value ");
    description.appendValue(captured);
}

public Object invoke(Invocation invocation) throws Throwable {
    return captured;
}
}

Затем его можно использовать как:

 context.checking(new Expectations() {{
CapturingMatcher<String> returnCapturedValue = new CapturingMatcher<String>();
allowing(mockObject).getParameter(with(equal("expectedParameterName")), with(returnCapturedValue)); will(returnCapturedValue);
}});
...