9

カスタムクラスをモックする必要があります(シャドウを作成します)。私はすでにhttp://robolectric.org/custom-shadows/でこれを行う方法を読んでいます。

だから、私はいくつかのクラスを持っています:

public class MyClass {

  public static int regularMethod() { return 1; }
}

影を作成します:

@Implements(MyClass.class)
public class MyShadowClass {

  @Implementation
  public static int regularMethod() { return 2; }
}

そして、私はテストクラスで影を設定します:

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, shadows={MyShadowClass.class})
public class MyTest {

  @Test
  public void testShadow() {
      assertEquals(2, MyClass.regularMethod());
  }
}

ただし、影は使用されません。

java.lang.AssertionError: 
Expected :2
Actual   :1

RobolectricGradleTestRunner でカスタム シャドウを表示するにはどうすればよいですか?

私はすでに試しました:

  1. http://www.codinguser.com/2015/06/how-to-create-shadow-classes-in-robolectric-3/
  2. https://github.com/jiahaoliuliu/RobolectricSample/blob/master/app-tests/src/main/java/com/jiahaoliuliu/robolectricsample/RobolectricGradleTestRunner.java
  3. Robolectric カスタム シャドウ クラスを使用したネイティブ メソッドのモック

しかし、次のようなさまざまなコンパイルエラーが発生します

  • InstrumentingClassLoaderConfig見つかりません
  • Setup見つかりません

Robolectric 3.0でカスタム シャドウを正しく使用する方法は?

4

2 に答える 2

5

カスタム シャドウは避けるべきであり、最後の手段にする必要があります。コードで多くのリファクタリングを行うことができないため、ネイティブ メソッド呼び出しのようにテストを実行できない場合にのみ使用してください。そのクラスのオブジェクトをモックするか、powermock または mockito を使用してスパイする方が、カスタム シャドウを作成するよりも優れています。静的メソッドの場合は、powermock を使用します。

私たちのプロジェクトでは、いくつかのネイティブ メソッドを持つクラスがあり、それはアプリのあらゆる場所で使用される構成クラスでした。そのため、ネイティブ メソッドを別のクラスに移動し、それをシャドウしました。これらのネイティブ メソッドはテスト ケースに失敗していました。

とにかく、robolectric 3.0 でシャドウをカスタマイズする方法は次のとおりです。

RobolectricGradleTestRunner を拡張するカスタム テスト ランナーを作成します。

public class CustomRobolectricTestRunner extends RobolectricGradleTestRunner {


public CustomRobolectricTestRunner(Class<?> klass) throws InitializationError {
    super(klass);
}

public InstrumentationConfiguration createClassLoaderConfig() {
    InstrumentationConfiguration.Builder builder = InstrumentationConfiguration.newBuilder();
    builder.addInstrumentedPackage("com.yourClassPackage");
    return builder.build();
}

パッケージに、robolectric を使用して実行しているテスト ケースが含まれていないことを確認してください。

于 2015-08-12T15:17:50.250 に答える
3

私は、あなたが参照している 2 番目のリポジトリの作成者、Jiahao です。

まず、私のコードをチェックしていただきありがとうございます。私は Android について多くの研究を行っており、私の研究が他の誰かに役立つことをうれしく思います。

次に、Robolectric についての影。このプロジェクトでは Robolectric 3.1 を使用して、Robolectric 3 が MarshMallow とどのように連携するかをテストしています: https://github.com/jiahaoliuliu/robolectricForMarshmallow

新しい Runtime Permission Manager をテストし、アプリケーションとアクティビティをシャドーイングしました。

シャドウ アクティビティのサンプル コードを次に示します。

import android.content.Context;
import com.jiahaoliuliu.robolectricformarshmallow.controller.MainController;
import org.robolectric.annotation.Implementation;
import org.robolectric.annotation.Implements;

/**
 * Created by Jiahao on 7/18/16.
 */
@Implements(MainController.class)
public class MainControllerShadow {

    public void __constructor__ (Context context) {
        // Not do anything
    }

    @Implementation
    public String getTextToDisplay(boolean permissionGranted) {
        return "Test";
    }
}

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/shadow/MainControllerShadow.java

そして、これが単体テストでの使用方法です。

パッケージcom.jiahaoliuliu.robolectricformarshmallow;

import com.jiahaoliuliu.robolectricformarshmallow.shadow.MainControllerShadow;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.Robolectric;
import org.robolectric.RobolectricGradleTestRunner;
import org.robolectric.annotation.Config;

import static org.junit.Assert.*;

/**
 * Created by Jiahao on 6/30/16.
 */
@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, manifest = Config.NONE, application = FoolApplication.class,
    shadows = { MainControllerShadow.class}, sdk = 18)
public class MainActivityTest {

    private MainActivity mMainActivity;

    @Before
    public void setUp() throws Exception {
        mMainActivity = Robolectric.setupActivity(MainActivity.class);
    }

    @After
    public void tearDown() throws Exception {

    }

    @Test
    public void testOnCreate() throws Exception {
        // Simple test to know that it works
        assertTrue(true);
    }
}

https://github.com/jiahaoliuliu/robolectricForMarshmallow/blob/master/app/src/test/java/com/jiahaoliuliu/robolectricformarshmallow/MainActivityTest.java

ご覧のとおり、カスタマイズされた Gradle Test Runner は使用していません。Robolectric のソース コードを確認しました。バージョン 3.0 および 3.1 (最新) では、ヘッダーでシャドウ クラスを指定するだけで十分です。

役立つことを願っています

于 2016-07-18T12:28:44.437 に答える