这是我最近经常遇到的一个模式示例。我有一个要测试的方法,它需要一个列表,并且可以为列表中的每个项目调用一些其他方法。为了测试这一点,我定义了一个带有预期调用参数的迭代器,并在 JMock 预期中定义了一个循环,以检查是否针对迭代器的每个项目进行了调用(参见下面的简单示例)。
我已经查看了 Hamcrest 匹配器,但没有找到可以对此进行测试的东西(或者误解了可用匹配器的工作方式)。有没有人有更优雅的方法?
package com.hsbc.maven.versionupdater;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.maven.plugin.testing.AbstractMojoTestCase;
import org.jmock.Expectations;
import org.jmock.Mockery;
import org.jmock.Sequence;
import org.jmock.internal.NamedSequence;
public class FooTest extends AbstractMojoTestCase {
public interface Bar {
void doIt(String arg);
}
public class Foo {
private Bar bar;
public void executeEven(final List<String> allParameters) {
for (int i = 0; i < allParameters.size(); i++) {
if (i % 2 == 0) {
bar.doIt(allParameters.get(i));
}
}
}
public Bar getBar() {
return bar;
}
public void setBar(final Bar bar) {
this.bar = bar;
}
}
public void testExecuteEven() {
Mockery mockery = new Mockery();
final Bar bar = mockery.mock(Bar.class);
final Sequence sequence = new NamedSequence("sequence");
final List<String> allParameters = new ArrayList<String>();
final List<String> expectedParameters = new ArrayList<String>();
for (int i = 0; i < 3; i++) {
allParameters.add("param" + i);
if (i % 2 == 0) {
expectedParameters.add("param" + i);
}
}
final Iterator<String> iter = expectedParameters.iterator();
mockery.checking(new Expectations() {
{
while (iter.hasNext()) {
one(bar).doIt(iter.next());
inSequence(sequence);
}
}
});
Foo subject = new Foo();
subject.setBar(bar);
subject.executeEven(allParameters);
mockery.assertIsSatisfied();
}
}