2011-02-04 84 views
6

我有一个静态方法的类,我目前正在用JMockit嘲笑。说它看上去像:在JUnit测试中使用JMockit多次嘲弄静态方法

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

我有另一个类(姑且称之为MyClass的)调用Foo的静态方法;我正在为这个类编写测试用例。我的JUnit测试,使用JMockit,看起来是这样的:

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以外的值吗? – 2011-02-05 13:05:30

回答

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来完成,如果需要更大的灵活性。