2011-02-04 18 views
6

私は現在JMockitを嘲笑している静的メソッドを持つクラスを持っています。それは次のようになります:JUnitテストでJMockitを使用して静的メソッドを複数回モックします

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

私はFooの静的メソッドを呼び出す別のクラス(MyClassと呼ぶ)を持っています。私はこのクラスのテストケースを記述しようとしています。これは結構な作品、およびテストが実行されたときに、それが呼び出すときはMyClassの私のインスタンスが正しくFoo.FooValue.Xの列挙型の値を取得します

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(); 
} 

:JMockitを使用して、私のJUnitテストは、次のようになりますFoo.getValue()。

今、私はすべてをの値を反復しようとしており、繰り返しテストを実行しています。上記のテストコードをforループに入れて、疑似静的メソッドの結果を各列挙値に設定しようとすると、動作しません。 Foo.getValue()の模倣されたバージョンは常にFoo.FooValue.Xを返し、列挙を反復するときに他の値は決して返しません。

1回の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(); 
     } 

    } 
} 

任意のアイデア:私はこの(しかし、明らかにそれが動作しない)ような何かをしたいですか?代わりに、単一の記録で「メソッドを複数回からかっ」、あなたは記録すべき複数の連続の戻り値の

+0

FooValue.X以外の値で(最初のケースで)期待どおりに正しく動作していますか? –

答えて

5

:より多くの柔軟性が必要な場合

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で行うことができます。

関連する問題