Mockitoは、何かがスパイされたときにプロキシインスタンスを作成します。今、そのプロキシインスタンス上で実行されるセッターを、その背後にある実際のインスタンスに転送する方法はありますか?アクティビティを正しくスパイする方法
理由:私は完全に私のコントロール下にないオブジェクトインスタンス、つまりAndroidのアクティビティを持っています。私は私のアプリのほとんどの部分にプロキシー版を与えてもいいですが、でもだから私は活動の作成段階で非常に早い段階でスパイ/プロキシーを作成する必要があるからです。基本コンテキストは添付されません。これはプロキシインスタンスで発生し、もちろんアクティビティインスタンス自体(Activity.this
経由で自身を参照しています)では使用されません。最終的には、リソースの解決がこの基本コンテキストを介して行われるため、クラッシュが発生するため、内部のフラグメント機構によってNPEなどが発生します。 - 任意のアイデア
public class CustomAndroidJUnitRunner extends AndroidJUnitRunner {
@Override
public Activity newActivity(ClassLoader cl, String className, Intent intent)
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
Activity activity = super.newActivity(cl, className, intent);
return maybeStubSomeDelegate(activity);
}
private Activity maybeStubSomeDelegate(Activity activity) {
if (!(activity instanceof SomeDelegate)) {
return activity;
}
Activity spiedActivity = spy(activity);
doReturn(SomeDelegateMock.getInstance())
.when((SomeDelegate) spiedActivity)
.getDelegate();
return spiedActivity;
}
}
私は無知だ:ここで
はいくつかのコードですか?
あなたは実際のオブジェクトのメソッドをトリガーすることができ、独自のセッターを作成することができますプロキシを作成するときに、あなたの活動に独自のプロキシ(またはRobolectricは「影」それらを呼び出すように)作成するをRobolectricを使用することができます
。 –
私は既にエスプレッソを使用していますが、これは私の質問とは関係ありません。 –
は@VisibleForTesting setDelegate()メソッドをあなたのアクティビティに追加していますか?私は、アクティビティのスパイを注入することを含むどのようなアプローチでも、動作しない場合が常にあると感じています。 – jdonmoyer