2016-02-19 13 views
27

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を使用することができます

+0

。 –

+0

私は既にエスプレッソを使用していますが、これは私の質問とは関係ありません。 –

+0

は@VisibleForTesting setDelegate()メソッドをあなたのアクティビティに追加していますか?私は、アクティビティのスパイを注入することを含むどのようなアプローチでも、動作しない場合が常にあると感じています。 – jdonmoyer

答えて

0

、影の例を作成する方法

@Implements(Bitmap.class) 
public class MyShadowBitmap { 

@RealObject private Bitmap realBitmap; 
private int bitmapQuality = -1; 

@Implementation 
public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream) { 
    bitmapQuality = quality; 
    return realBitmap.compress(format, quality, stream); 
} 

public int getQuality() { 
    return bitmapQuality; 
} 
} 
} 

@RealObjectはあなたの本当のインスタンスであるとき、

これを使う秒次のようにRobolectricテストランナーを使用してhadowは、新しいテストクラスを定義します。

@RunWith(RobolectricTestRunner.class) 
@Config(shadows = MyShadowBitmap.class) 
public class MyTestClass {} 

をメソッドを使用し、現在の影のインスタンスを引っ張って:

shadowOf() 

そして、どのような場合には、ここでRobolectricへのリンクです:

は、あなたも活性を制御することができますのでhttps://google.github.io/android-testing-support-library/docs/espresso/:あなたはエスプレッソを使用していないのはなぜ

http://robolectric.org/custom-shadows/

+0

これは単体テストに役立つかもしれませんが、私は実際に計装テストについて話していました:) –

+0

計装テストにも便利です(デバイスエミュレータ上で実行したくないと仮定して) –

関連する問題