0

JMock を使用して素敵なモックを作成する最良の方法はありますか?

例えば:

public interface Dependency {
    void someSetUp();
    void interactionUnderTest();
    void someCleaningAfterWork();
}

public class CUT {
    private Dependency dependency;

    public void methodUnderTest() {
        dependency.someSetUp();
        dependency.interactionUnderTest();
        dependency.someCleaningAfterWork();
    }

    public void setDepencency(Dependency dependency) {
        this.dependency = dependency;
    }
}

Mockito の場合、ソリューションは簡単です。

@Test
public void mockitoExample() throws Exception {
    Dependency dependency = mock(Dependency.class);
    classUnderTest.setDepencency(dependency);
    classUnderTest.methodUnderTest();
    verify(dependency).interactionUnderTest();
}

しかし、JMockの場合、私はこの解決策しか見つけませんでした:

@Test
public void jMockExample() throws Exception {
    JUnit4Mockery ctx = new JUnit4Mockery();
    final Dependency dependency = ctx.mock(Dependency.class);
    classUnderTest.setDepencency(dependency);
    ctx.checking(new Expectations() {{
        allowing(dependency).someSetUp();
        one(dependency).interactionUnderTest();
        allowing(dependency).someCleaningAfterWork();
    }});

    classUnderTest.methodUnderTest();
}

問題は次の行にあります。

allowing(dependency).someSetUp();
and
allowing(dependency).someCleaningAfterWork();

Dependency から別のメソッドを呼び出すなどして methodUnderTest が変更された場合、JMock を使用する場合はテストを手動で変更する必要があります。それを回避する方法はありますか?

PS私の英語について申し訳ありません

4

1 に答える 1

2

本当に必要な場合はallowing(dependency)、オブジェクトのすべてを許可するを使用できます。

「素敵な」モックをサポートしていないのには理由があります。これは、単体テストからコードを駆動せずに、コード内で任意に何かが発生することを望まないためです。全体として、この種の脆弱性は設計の弱点に起因することがわかり、テストフィードバックを使用してそれを発見します。

この例では、さまざまな依存関係メソッド間の関係、つまり「プロトコル」に関心があります。それを分離して、一度実装するようにしたいのです。つまり、一度だけテストする必要があるので、「素敵な」モックはそれほど役に立ちません。

于 2012-11-15T09:21:59.343 に答える