1

私は PowerMock / EasyMock の世界に比較的慣れていないので、比較的簡単だと思っていたことがうまくいきません。おそらく、誰かが私が間違っている場所を教えてくれるでしょう。

次の 2 つのクラスを検討してください。

public class Foo
{
    public int doStuff(int a)
    {
        return (5 / a);
    }
}

public class Bar
{
    public void doSomething()
    {
        Foo foo = new Foo();
        int c = foo.doStuff(0);
    }
}

ここで、テスト クラスで、Bar メソッドの doSomething をテストします。私が抱えている問題は、Foo の使用です。ご覧のとおり、Foo に 0 を渡すと、ゼロ除算エラーが発生します。これが起こらないように、 Foo.doStuff() をスタブ化/抑制したいと思います。本当に必要なのは、doStuff() が実際に呼び出されるようにすることだけです。だから、私はこれをやった:

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Foo.class })                 

public class TestStuff
{

@Test
public void testOtherStuff() throws Exception
{

    Foo fooMock = PowerMock.createMock(Foo.class);
    expectNew(Foo.class).andReturn(fooMock);
    EasyMock.expect(fooMock.doStuff(anyInt())).andReturn(1);
    //fooMock.doStuff(anyInt());

    //suppress (method(Foo.class, "doStuff"));

    replayAll();

    Bar bar = new Bar();
    bar.doSomething();

    verifyAll();
}
}

これを実行すると、ゼロ除算の例外が発生します。expect() 呼び出しを使用し、戻り値 1 を指定すると、メソッドが実行されなくなると考えていました。これは明らかにそうではありません。最初の質問は、なぜですか?

それで、上でコメントアウトされているステートメントを実行してみました。つまり、expect() 呼び出しをコメントアウトし、他の 2 つのステートメントを使用して、メソッドの実行を抑制しなければならないと考えました。私は、suppress() ステートメントを実行しないと、常にゼロ除算の例外が発生することがわかりました。ただし、そこに抑制ステートメントを入れると、doStuff が 1 回呼び出されると予想され、実際の呼び出しは 0 だったという assertionerror が表示されます。

では、なぜメソッドは実行済みとしてカウントされないのでしょうか?

メソッドを「スタブ」するためのモックを取得して、実際には何も実行されていないと見なされるようにするにはどうすればよいですか?

私が扱ってきた状況では、実際には doStuff で void が返されます。戻り値のないメソッドを処理するメソッドと、返すメソッドを処理するメソッドでは、必要なモック ステートメントがどのように異なるのでしょうか?

私はこの仕事をする寸前にいるようですが、ここで試みられているステートメントのある種の間違った組み合わせがあるように感じます. 私はこれに頭を悩ませ、たくさんの例を読みましたが、まだ不足しています。

何か助けはありますか?

ありがとう、

クレイグ

4

1 に答える 1

3

PowerMock ドキュメントからこれを見てください: http://code.google.com/p/powermock/wiki/MockConstructor

何かのようなもの:

Foo fooMock = createMock(Foo.class);
expectNew(Foo.class, 0).andReturn(fooMock);

編集: ドキュメントの実際の関連部分を追加します(Craigが自分で見つけたもの):

テスト ケースのクラス レベルで@PrepareForTest( ClassThatCreatesTheNewInstance .class) アノテーションを使用します。

于 2011-03-11T23:51:55.560 に答える