2011-12-15 8 views
5

私は 'ImporterService'クラスをテストするためのテストクラスを作成しています。このサービスはInputStreamを読み取り、そのデータからObjectを作成します。 Object(この場合はBuilderクラス)は、 'ImporterService'クラス内でインスタンス化されます。私の 'ImporterService'クラスをテストするためには、Builderクラスの呼び出しを検証する必要があります。このため私はMockingフレームワークを使いたいと思いますが、 'ImporterService'の外に 'Builder'オブジェクトの模擬インスタンスを作成するにはどうすればいいですか?私は、テストのセットアップに上書きすることができ、保護法にビルダークラスの作成を動かす考えていた内部インスタンスオブジェクトの模擬

 


    public Builder importFrom(BufferedReader reader) throws IOException { 
     String someValue = readFrom(reader); 
     Builder builder = new Builder(); // I need to mock this Builder object... 
     builder.someMethod(someValue);  // to see of a method is called with the expected value 
    } 
 

:よう

私の「ImporterService」クラスのメソッドを探します。しかし、このソリューションは、ImporterServiceクラスが内部ロジックを漏らしているので、私が望まない他のクラスによってメソッドをオーバーライドすることができるので、私にはあまりうまくありません。

答えて

2

依存性注入ライブラリ(Springなど)を使用する場合は、ImporterServiceクラスにBuilderの代わりにモックオブジェクトを挿入できます。あるいは、コンストラクタへの呼び出しをfactoryへの呼び出しで置き換えることができ、factoryを使用すると、テストコードでモックが返されます。

+0

:あなたは次の操作を行い、あなたのユニットテストで

public class Reader{ private BuilderFactory factory = new BuilderFactory(); // Use production factory by default public Builder importFrom(BufferedReader reader) throws IOException { String someValue = readFrom(reader); Builder builder = factory.buildBuilder(); builder.someMethod(someValue); // to see of a method is called with the expected value } } 

:ここ

は、あなたがこれを達成する方法を示すEasyMockを使用した例でありますあなたのユニットがテストする別のDIフレームワークに春に入ります。あなたの配線をテストしていない限り –

0

あなたは(私は、このモックフレームワークをrecomment)jMocktを使用していると仮定すると、あなたは、次の操作を行うことができるようになります。このようPowerMockとして

@Test 
    public void testFoo(@Mocked Builder builder) { 
     new Expectations() { 
      { 
       new Builder(); 
       returns(builder); 

       builder.setSomemethod() 
       ... 
      } 
     }; 

     assertSame(builder,impoertesService.importFrom(...)); 
    } 
0

いくつかのモックフレームワークは、オブジェクトの構築を模擬することができます。

0

あなたはこのような何かに関数のシグネチャを変更することができます:あなたは、テストケースから任意のダミー実装を渡すことができ、これを行うことにより、

public Builder importFrom(BufferedReader reader, Builder builder) throws IOException { 

。これは依存性注入の1つの方法です。

依存性注入のアイデアは、すべての依存関係を尋ねることです。クラス/関数がそれを行う場合、コードは非常にテスト可能になります。

1

はい、あなたが示唆したように行うかのいずれかです。

あなたがBuilderオブジェクトを作成し、リーダークラスに割り当てているファクトリクラスを作成します。あなたの単体テストでは、この工場を模擬して、単体テストでメソッド呼び出しを確認できるように、自分で選択したBuilderを作成するように強制します。あなたが必要としない優れたモックフレームワークを使用している場合

Reader classUnderTest = new Reader(); 
BuilderFactory fakeFactory = EasyMock.createNiceMock(BuilderFactory.class); 
Builder builder = EasyMock.createMock(Builder.class); 
EasyMock.expect(fakeFactory.buildBuilder()).andReturn(builder); 
builder.someMethod("value here"); 
EasyMock.expectLastCall().once(); 
EasyMock.replay(fakeFactory, builder); 
classUnderTest.importFrom(bufferReader); 
// Very that all calls were correctly performed on the builder 
EasyMock.verify(builder);