2011-08-17 2 views
6

オブジェクトを作成するためのファクトリを使用してクラスを取得しました。 私のユニットテストでは、工場の戻り値にアクセスしたいと思います。 ファクトリは直接クラスに渡され、作成されたオブジェクトのゲッタは提供されないため、ファクトリからオブジェクトを戻すことを傍受する必要があります。Mockito + Spy:戻り値を取得する方法

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(factory); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 

工場の戻り値にアクセスする可能性はありますか?おそらくスパイを使用していますか?
私が見ることができる唯一の方法は、メソッドを作成し、工場を模擬することです...

よろしく

+0

:使用方法対象

public class ResultCaptor<T> implements Answer { private T result = null; public T getResult() { return result; } @Override public T answer(InvocationOnMock invocationOnMock) throws Throwable { result = (T) invocationOnMock.callRealMethod(); return result; } } 

。工場で作られた実際のクラスを求めてはいけません。 ?(Demeterの法則) –

+0

'TestedClass'はOSGiコンポーネントです。コンポーネントのメソッドは、各呼び出しに、ファクトリによって作成された新しいオブジェクトを必要とします。私は、より良いテスト容易性を提供するために、オブジェクトの作成をファクトリ・クラスにリファクタリングしました。作成されたオブジェクトはメソッドのパラメータによって初期化されるため、ファクトリではなく作成されたオブジェクトを単純に渡すことはできません。 –

答えて

1

標準あざけるアプローチはに次のようになります。

  1. あなたが工場をしたいの事前作成オブジェクトテストケースに戻る
  2. 工場のモック(またはスパイ)を作成する
  3. 事前に作成したオブジェクトを返すようモックファクトリを指定します。

あなたは本当にRealFactoryその場でオブジェクトを作成したい場合は、あなたがそれをサブクラス化しsuper.create(...)を呼び出すためのファクトリメソッドをオーバーライドし、その後、テストクラスがアクセスできるフィールドへの参照を保存して、返すことができます作成されたオブジェクト

24

まず、コンストラクタの引数としてspyを渡す必要があります。

それを除いて、これを行う方法は次のとおりです。 `TestedClass`が依存関係として工場内で取るべき理由

RealFactory factory  = new RealFactory(); 
RealFactory spy   = spy(factory); 
TestedClass testedClass = new TestedClass(spy); 

// At this point I would like to get a reference to the object created 
// and returned by the factory. 


// let's capture the return values from spy.create() 
ResultCaptor<RealThing> resultCaptor = new ResultCaptor<>(); 
doAnswer(resultCaptor).when(spy).create(); 

// do something that will trigger a call to the factory 
testedClass.doSomething(); 

// validate the return object 
assertThat(resultCaptor.getResult()) 
     .isNotNull() 
     .isInstanceOf(RealThing.class); 
+0

共有いただきありがとうございます。 IMHO:これは受け入れられた答えでなければなりません。 – BetaRide

関連する問題