gpt4 book ai didi

java - 使用jmock如何重用参数

转载 作者:行者123 更新时间:2023-12-01 19:23:09 25 4
gpt4 key购买 nike

我正在构建一个测试,我需要在其中发送问题,然后等待答案。消息传递不是问题。事实上,为了找出哪个答案对应哪个问题,我使用了 id。我的 ID 是使用 UUID 生成的。我想检索这个 id,它作为模拟对象的参数给出。它看起来像这样:

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

其中correlationId是我想为像这样的其他期望保留的字符串:

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

你有答案了吗?

最佳答案

您必须创建自己的操作。这是我的:

/**
* 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)));
}});

为了做你想做的事,你必须实现你自己的匹配器。这就是我所破解的(省略了一些空检查,当然我只是使用示例中众所周知的接口(interface)):

 @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));
}
}
}

关于java - 使用jmock如何重用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2908671/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com