1

私たちが持っているとしましょう

public class Foo {
   public static Foo getInstance() {...}

   public Bar bar(Baz baz) {...}
}

私がやりたいことは、単体テストでそれをモックすることです。クラスの静的メソッドと動的メソッドの両方をモックする必要がありますFoo。モッキングgetInstance()は簡単です

import static org.powermock.api.easymock.PowerMock.replace;
import static org.powermock.api.easymock.PowerMock.method;

public class MyTest {

   @Test
   public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));
   }

   public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      EasyMock.replay(foo);
      return foo;
   }
}

問題は、メソッドをモックbarする方法です。

replace(method(...)).with(method(...))動的メソッド用に設計されていないため、前のトリックは機能しません。

すでにモックされたクラスの上にモックしようとしても機能しません。

...
@Test
public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));

      Foo foo = Foo.getInstance();  // works well
      Baz baz1 = new Baz();
      Baz baz2 = new Baz();
      EasyMock.expect(foo.bar(baz1)).andReturn(baz2);  // exception thrown
      EasyMock.replay(foo);
}
...

上記のコードは をスローしAssertionError: Unexpected method call barます。

では、どうすれば両方を行うことができますか?現実の世界では、静的メソッド内からは利用できないデータが必要なので、モッキングを.bar(...)入れたくありません。getMockInstancegetMockInstance

4

1 に答える 1

3

問題は、モックでリプレイを2回呼び出していることだと思いますfoo。1回はモックされた静的メソッドで、もう1回はモックに呼び出しを期待するgetMockInstance()ように指示した後です。を変更してみてくださいfoofoo.bar(bar1)getMockInstance()

   public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      return foo;
   }

メソッド呼び出しfooを期待するように指示した後、EasyMockに再生するように指示します。barしたがって、MyTest.java は次のようになります。

@Test
public void myTest() {
      replace(method(Foo.class, "getInstance"))
         .with(method(MyTest.class, "getMockInstance"));

      Foo foo = Foo.getInstance();  // works well
      Baz baz1 = new Baz();
      Baz baz2 = new Baz();
      EasyMock.expect(foo.bar(baz1)).andReturn(baz2);  // exception thrown
      EasyMock.replay(foo);
}

  public static Foo getMockInstance() {
      Foo foo = EasyMock.createMock(Foo.class);
      return foo;
   }
于 2011-02-02T13:35:57.607 に答える