1

現在のフレームワークには、ActivityInstrumentationTestCase2 | を拡張する基本クラスがあります。Android 開発者。通常、テスト ケース クラスを記述するときは、この基本クラスを継承し (これを FooBase と呼びます)、メソッドを記述します。ご想像のとおり、これは非常に大きくなっています。テストしている機能の各領域を独自のクラスにして、再利用できるようにリファクタリングしたいと考えています。私のあいまいなクラスが十分に正確であることを願っています 目標は、メソッドを異なるクラスに分割して、テストケースから呼び出すことができるようにすることです

 public class FooBase extends ActivityInstrumentionTestCase2 {
    @Override
 public void runTestOnUiThread(Runnable runnable) {
    try {
        super.runTestOnUiThread(runnable);
    } catch (InterruptedException e) {
        throw RuntimeInterruptedException.rethrow(e);
    } catch (RuntimeException e) {
        throw e;
    } catch (Error e) {
        throw e;
    } catch (Throwable e) {
        throw new RuntimeException(e);
    }
 }
 } 

そして私たちのテストは例えば

public class TestFooBase extends FooBase{
      public void testfeature(){
               //execute a method that uses super.runTestOnUiThread()
      }

 }

リファクタリングを試みた方法

 public class FooHelper extends FooBase{
     public FooHelper(Activity activity){
         setActivity(activity)
     }
     public void sameMethod(){
         //moved the method in FooBase to this class that uses the runTestOnUiThread
     }

}

私の新しいテストケースは次のようになります

public class TestFooBase extends FooBase{
      FooHelper fooHelper;
      public void setup(){
              fooHelper = new FooHelper(getActivity);
      }
      public void testfeature(){
               //execute a method that uses super.runTestOnUiThread()
               fooHelper.callthemethod()
      }

 }

これを実行すると、super.runTestOnUIThread で null ポインターが取得されます。

4

1 に答える 1

1

テスト クラス全体を渡して、そのコンストラクターを設定できます。

public class BaseTestCase {
    private Instrumentation instrumentation;
    private InstrumentationTestCase instrumentationTestCase;

    public BaseTestCase(InstrumentationTestCase testClass, Instrumentation instrumentation){
        this.instrumentationTestCase = testClass;
        this.instrumentation = instrumentation;
}

    public Activity getCurrentActivity() {
        try {
            instrumentationTestCase.runTestOnUiThread(new Runnable() {
                @Override
                public void run() {
                   //Code
                }
            });
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        return activity;

}

使用するには、setUp メソッドで BaseTestCase クラスをインスタンス化する必要があります

public class ActivityTest extends ActivityInstrumentationTestCase2<TestActivity.class>{
    private BaseTestCase baseTestCase;
    @Override
    public void setUp() throws Exception { 
        super.setUp();
        getActivity();
        baseTestCase = new BaseTestCase(this, getInstrumentation());
    }
}

BaseTestCase のパブリック メソッドにアクセスするには

public void testRun(){
    baseTestCase.getCurrentActivity();
}
于 2014-08-27T01:03:06.127 に答える