2011-02-04 4 views
6

저는 현재 JMockit과 조롱하고있는 정적 메서드를 가진 클래스가 있습니다. 다음과 같이 말하십시오.JUnit 테스트에서 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.FooValue.X의 열거 값을 얻을 것이다 Foo.getValue().

이제 모두를 값으로 반복하고 테스트를 반복 실행하려고합니다. 위의 테스트 코드를 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(); 
     } 

    } 
} 

어떤 아이디어라도? 대신 하나의 녹화에서 "방법을 여러 번 조롱"당신은 기록해야합니다 연속 된 여러 반환 값의

+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와 함께 할 수 있습니다.

관련 문제