2011-02-04 27 views
6

Tôi có một lớp với các phương thức tĩnh mà tôi hiện đang chế nhạo với JMockit. Nói như sau:Giả lập phương thức tĩnh nhiều lần bằng JMockit trong thử nghiệm JUnit

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

Tôi có một lớp khác (gọi là MyClass) gọi phương thức tĩnh của Foo; Tôi đang cố gắng viết các trường hợp kiểm tra cho lớp này. kiểm tra JUnit của tôi, sử dụng JMockit, trông giống như sau:

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

này hoạt động tốt và dandy, và khi kiểm tra được thực hiện ví dụ của tôi về MyClass một cách chính xác sẽ nhận được giá trị enum của Foo.FooValue.X khi nó gọi Foo.getValue().

Bây giờ, tôi đang cố gắng lặp lại trên tất cả các giá trị trong điều tra và liên tục chạy thử nghiệm. Nếu tôi đặt mã thử nghiệm ở trên trong vòng lặp for và cố gắng đặt kết quả của phương thức tĩnh giả định thành từng giá trị đếm, thì nó không hoạt động. Phiên bản giả lập của Foo.getValue() luôn trả về Foo.FooValue.X và không bao giờ có bất kỳ giá trị nào khác khi tôi lặp lại thông qua điều tra.

Làm cách nào để chuyển đổi phương thức tĩnh nhiều lần trong thử nghiệm JUnit đơn lẻ? Tôi muốn làm một cái gì đó như thế này (nhưng rõ ràng là nó không hoạt động):

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

    } 
} 

Bất kỳ ý tưởng nào?

+0

bạn có chắc chắn rằng kỳ vọng của bạn hoạt động chính xác (trong trường hợp đầu tiên) với các giá trị khác ngoài FooValue.X? –

Trả lời

5

Thay vì "chế giễu phương pháp nhiều lần", bạn nên ghi lại nhiều giá trị liên tiếp trở lại trong một ghi duy nhất:

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

Nó cũng có thể được thực hiện với một Delegate, nếu linh hoạt hơn đã được yêu cầu.

Các vấn đề liên quan