2012-05-30 25 views
5

など。EasyMockを使ってオブジェクトを部分的にモックする方法はありますか?

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

そして、私はFoo.aをテストしたい:のは、私はこのクラスを持っているとしましょう。私はFoo.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サブクラスを書くことができます知っている:私は何を想像してることは、このようなものです。しかし、私はそれが退屈である、すなわち自動化されるべきであるので、私がする必要がなければ、私はそれをしたくありません。

答えて

2

私はあなたがEasyMock拡張ライブラリを使ってそれを行うことができると思います。ここで簡単な例を見つけることができますPartial Mocking

+0

ありがとうを使用して部分的なモックを作成することができます!残念ながら、classextensionsを使用するには、Junit 4が必要になると思われます。(:http://easymock.org/EasyMock2_2_ClassExtension_Documentation.htmlこれは、Junit 3ユーザーが運が良かったことを意味します。 – allyourcode

+0

ああ...私もあなたの事例を考えていますが、簡単なモックを使用するのではなく、メソッドをオーバーライドしてモックを作成し、モック 'Bar'オブジェクトを拡張モッククラスから戻します。 – raddykrish

+2

EasyMock 3.1 ClassExtensionsライブラリは廃止され、一部の模擬はEasyMock自体に移されました。これはJUnit 3で動作するので運が良いと言います:http://easymock.org/EasyMock3_1_Documentation.html – DoctorRuss

1

JUnit 4にアップグレードし、classextensionsを使用する方法があります。 (実際、私が代わりにEasyMockのMockitoを使用しますが、のは、あなたのテストスイート全体を書き換えないようにしましょうでしょう。)あなたは、あなたは常にthusly独自のスパイを作成することができますすることができない場合は、次の

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

} 
+0

しかし、FooSpyを書いていないのは、一種のポイントです。 – allyourcode

+0

classextensionsを使用できないためにハムストールされない限り、一種のポイントです。あなたのスパイを食べました。しかし、@ DoctorRussのコメントに基づいて、運が良かったようです。 – jhericks

2

をOPが表示されます(?)サブクラス化が部分的な模擬よりもいくぶん難しく、退屈であることを示唆しています。私はそれを考え直す価値があることを示唆している。テストクラスで例えば

、:

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

が簡単、およびその他の問題が生じにくい思えるOP状態、ない、EasyMockを使用するよりも(検証/再生するのを忘れるの/ etc。)。 EasyMock 3.0+で

+1

私はあなたがJavaでこれを行うことができるか分からなかった!私はこれが1.4の後に出てきたと思いますか?とにかく、これを使って模型を作ることができますか?その場合は、テストしていないメソッドのモックを呼び出す、新しい(サブ)クラス全体を作成する必要がないため、クールです。 – allyourcode

9

、あなたはmockbuilder

EasyMock.createMockBuilder(class).addMockedMethod("MethodName").createMock(); 
関連する問題