14

たとえば、私がこのクラスを持っているとしましょう:

public class Foo Implements Fooable {
  public void a() {
    // does some stuff
    bar = b();
    // moar coadz
  }
  public Bar b() {
    // blah
  }
  // ...
}

そして、私はテストしたいFoo.aFoo.bそのメソッドを個別にテストしているので、モックしたいです。私が想像しているのは、次のようなものです。

public class FooTest extends TestCase {
  public void testA() {
    Fooable foo = createPartialMock(
      Fooable.class,  // like with createMock
      Foo  // class where non-mocked method implementations live
    );

    // Foo's implementation of b is not used.
    // Rather, it is replaced with a dummy implementation
    // that records calls that are supposed to be made;
    // and returns a hard coded value (i.e. new Bar()).
    expect(foo.b()).andReturn(new Bar());

    // The rest is the same as with createMock:
    //   1. Stop recording expected calls.
    //   2. Run code under test.
    //   3. Verify that recorded calls were made.
    replay(foo);
    foo.a();
    verify(foo);
  }
}

Fooこの種のことを行うために、独自のサブクラスを作成できることを知っています。しかし、面倒なので、自動化する必要があるため、必要がない場合はそうしたくありません。

4

4 に答える 4

15

EasyMock 3.0 以降では、mockbuilderを使用して部分モックを作成できます。

EasyMock.createMockBuilder(class).addMockedMethod("MethodName").createMock();
于 2013-02-05T08:24:45.773 に答える
3

EasyMock 拡張ライブラリを使用してそれを行うことができると思います。この部分モッキングで簡単な例を見つけることができます

于 2012-05-30T22:46:46.413 に答える
2

OPは、部分的なモックよりもサブクラス化がどういうわけか難しいか退屈であることを示唆しているように見えます(?)。私はそれを再考する価値があることを提案します。

たとえば、テストクラスでは次のようになります。

  Foo dummyFoo = new Foo() {
      @Override public Bar b() { return new Bar(); }
   };

EasyMockを使用するよりも、OPが述べていることを実行し、単純に見え、他の問題(再生/検証などを忘れる)を起こしにくいように見えます。

于 2012-07-05T15:21:49.833 に答える
1

JUnit 4にアップグレードして、classextensionsを使用する方法を見つけます。(実際には、EasyMockの代わりにMockitoを使用しますが、テストスイート全体を書き直さないでください。)それができない場合は、いつでも独自のスパイを作成できます。

public class FooTest extends TestCase {
    public static class FooSpy extends Foo {
        private final Fooable mockFoo;

        FooSpy(Fooable mockFoo) {
            this.mockFoo = mockFoo;
        }

        public Bar b() {
            return mockFoo.b();
        }
    }

    public void testA() {
        Fooable mockFoo = createMock(Foo.class);
        Fooable fooSpy = new FooSpy(mockFoo);

        // Foo's implementation of b is not used.
        // Rather, it is replaced with a dummy implementation
        // that records calls that are supposed to be made;
        // and returns a hard coded value (i.e. new Bar()).
        expect(mockFoo.b()).andReturn(new Bar());

        // The rest is the same as with createMock:
        // 1. Stop recording expected calls.
        // 2. Run code under test.
        // 3. Verify that recorded calls were made.
        replay(mockFoo);
        foo.a();
        verify(foo);
    }

}
于 2012-05-31T02:15:58.320 に答える