抽象クラスを模擬しようとしていますが、私が見たものからは可能ではないと思います。特定の抽象クラスを拡張する必要があるジェネリックスを使用するクラスがいくつかあります。彼らのグループ全体があり、成功裏に嘲笑されています。抽象クラスを抽象クラスで模擬しています
public abstract class ChildPresenter <T extends ChildView> {
private T view;
public abstract T getView();
}
我々がテストしているクラスがそれに次があります:抽象クラスは、ジェネリックを返すを扱うとこのようになります一つの方法があるコンストラクタで
public class ParentPresenter {
private ConcreteChildPresenter1 childPresenter1;
private ConcreteChildPresenter2 childPresenter2;
private ConcreteChildPresenter3 childPresenter3;
private ConcreteChildPresenter4 childPresenter4;
List<ChildPresenter> childPresenters;
}
を、これらのクラスが注入され、 Google Guiceを使用して変数に設定し、子プレゼンターのリストに追加しました。
childPresenters
オブジェクトをすべて反復し、メソッドgetView()
を実行するものです。
私は私のテストクラスでこのようにそれを実行しようとしました:
public class ParentPresenterTest {
private ConcreteChildPresenter1 childPresenter1;
private ConcreteChildPresenter2 childPresenter2;
private ConcreteChildPresenter3 childPresenter3;
private ConcreteChildPresenter4 childPresenter4;
private List<ChildPresenter> childPresenters;
//This is an abstract class
private ChildView childView;
@BeforeTest
public void createInjector() {
Guice.createInjector(...//Creates a fake module and does binding for the variables mentioned earlier
//e.g.
childPresenter1 = mock(ConcreteChildPresenter1.class);
binder.bind(ConcreteChildPresenter1.class).toInstance(childPresenter1);
//e.t.c for other variables
//Same for child view
childView = mock(ChildView.class);
binder.bind(ChildView.class).toInstance(childView);
}
childPresenters = new ArrayList<ChildPresenter>();
childPresenters.add(childPresenter1);
//Add all child presenters
for(ChildPresenter childPresenter : childPresenters) {
when(childPresenter.getView()).thenReturn(childView);
}
}
}
Mockitoは、次のメッセージを表示して文句を言うような問題がラインwhen(childPresenter.getView()).thenReturn(childView);
で起こる:
org.mockito.exceptions.misusing。 WrongTypeOfReturnValue:
ChildView $$ $$ EnhancerByMockitoWithCGLIB 2f6a4bd5
はあなたが読んで、エラーの上に取得している理由がわからない場合***
ConcreteChildView1
を返す必要がありますgetViewメソッド()getViewメソッド()で返すことはできません。問題上記の構文の性質上発生する可能性がありますので:
この例外かもしれない誤って書かれたマルチスレッドテストで起こります。並行性テストの制限については、Mockito FAQを参照してください。
スパイは、(spy.foo())。then()構文を使用してスタブされます。メソッドのdoReturn | Throw()ファミリーでスパイをスタブする方が安全です。 Mockito.spy()メソッドのjavadocsの詳細私が理解することができます
が、私がしたいすべてが嘲笑ChildView
は以下を使用して、単一のメソッドを呼び出し確認されたときには、個々の具体的なChildView
を模擬するために、廃棄物と思われる:
verify(childView, atLeast(childPresenters.size())).getView();
これを行う別の方法はありますか?私はどうにかして具体的なものの代わりに擬似抽象クラスを使うことができますか?
public ConcreteChildPresenter1<ConreteChildView1> {
@Override
public ConreteChildView1 getView() {
view.buildView();
return view;
}
}
とすべての子ビューが広がることを抽象ChildView
クラス:ここ
EDITはgetView()
メソッドの実装方法の具体的なバージョンでの改良に基づいて
public abstract ChildView {
public abstract void buildView();
}
それからキャスト付きのAnnswer()はうまくいくかもしれません –
おそらく、実際のビューを挿入して、必要のないメソッドをモックすることができます。 –
あなたはすでに試してみましたか?doReturn(childView).when(childPresenter).getView(); –