これは私が最近よく遭遇したパターンの例です。 私は、リストを取り、リスト内の各項目に対して他のメソッドを呼び出すメソッドをテストします。これをテストするためには、期待される呼び出しパラメータを持つIteratorを定義し、イテレータの各項目に対して呼び出しが行われているかどうかを確認する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();
}
}
ありがとう、これは確かに私が気づいていたもので、将来はそれを使用しますが、私はこのプロジェクトで使用できるテストフレームワークの選択肢が限られています。 –
このバージョンは実際には同じことをテストしません。これは 'expected.Parameters.length()'が 'bar.doIt()'に呼び出され、各呼び出しが 'expectedParameters'の要素のうちの1つを渡すことだけを表明します。各要素が正確に1回だけ渡されるかどうかは検証されません。 コードがリストを反復処理できなかったというバグがある場合、このテストでは見つからないことがあります。 –