6

現在JMockitでモックしている静的メソッドを持つクラスがあります。次のように見えるとします。

public class Foo {
    public static FooValue getValue(Object something) {
        ...
    }
    public static enum FooValue { X, Y, Z, ...; }
}

Foo の静的メソッドを呼び出す別のクラス (MyClass と呼びましょう) があります。このクラスのテストケースを書こうとしています。JMockit を使用した私の JUnit テストは、次のようになります。

public class MyClassTest extends TestCase {
    @NonStrict private final Foo mock = null;

    @Test public void testMyClass() {
        new Expectations() {
            {
                Foo.getValue((Object) any); result = Foo.FooValue.X;
            }
        };
    }

    myClass.doSomething();
}

これはうまく機能し、テストが実行されると、MyClass のインスタンスは Foo.getValue() を呼び出すときに Foo.FooValue.X の列挙値を正しく取得します。

今、列挙内のすべての値を反復処理し、テストを繰り返し実行しようとしています。上記のテスト コードを for ループに入れて、モック化された静的メソッドの結果を各列挙値に設定しようとしても、うまくいきません。Foo.getValue() のモック バージョンは常に Foo.FooValue.X を返し、列挙を反復処理するときに他の値を返すことはありません。

単一の JUnit テスト内で静的メソッドを複数回モックするにはどうすればよいですか? 私はこのようなことをしたいです(しかし、明らかにうまくいきません):

public class MyClassTest extends TestCase {
    @NonStrict private final Foo mock = null;

    @Test public void testMyClass() {

        for (final Foo.FooValue val : Foo.FooValue.values() {

            new Expectations() {
                {
                    // Here, I'm attempting to redefine the mocked method during each iteration
                    // of the loop. Apparently, that doesn't work.
                    Foo.getValue((Object) any); result = val;
                }
            };

            myClass.doSomething();
        }

    }
}

何か案は?

4

1 に答える 1

5

「メソッドを複数回モックする」のではなく、1 回の記録で複数の連続した戻り値を記録する必要があります。

public class MyClassTest extends TestCase
{
    @Test
    public void testMyClass(@Mocked Foo anyFoo)
    {
        new Expectations() {{
            Foo.getValue(any);
            result = Foo.FooValue.values();
        }};

        for (Foo.FooValue val : Foo.FooValue.values() {
            myClass.doSomething();
        }
    }
}

Delegateさらに柔軟性が必要な場合は、を使用することもできます。

于 2011-02-08T14:12:16.120 に答える