2015-09-14 8 views
11

この問題は、私が取り除かれているようには見えませんが、おそらく3〜4ダース記事やスレッドを解決しようとしています。私は以下のすべてを概説しました。

基本的に問題は、私はRobolectricに欠陥がありますか?または、私が行方不明の小さなステップがあるか、またはプラグインの変な組み合わせがあります。これに関するすべての指針は非常に高く評価されます。

のWindows 7 バージョン:

  • のGradle 2.7
  • のAndroid Studioの1.3.2
  • Robolectric 3.0
  • Roboguice 3 +

プロジェクトの依存性:

dependencies { 
    classpath 'com.android.tools.build:gradle:1.3.0' 
    classpath "com.newrelic.agent.android:agent-gradle-plugin:4.244.0" 
    classpath 'com.github.triplet.gradle:play-publisher:1.1.2' 
    classpath 'org.moallemi.gradle.advanced-build-version:gradle-plugin:1.5.0' 
} 

アプリケーションの依存関係

import org.moallemi.gradle.internal.VersionCodeType 

apply plugin: 'com.android.application' 
apply plugin: 'newrelic' 
apply plugin: 'com.github.triplet.play' 
apply plugin: 'org.moallemi.advanced-build-version' 

android { 
def SERVICE_ACCOUNT = “account”; 
def P12_KEY = file('mykey.p12') 

signingConfigs { 
    releaseConfig { 
… 
    } 
} 

compileSdkVersion 22 
buildToolsVersion '22.0.1' 

advancedVersioning { 
    nameOptions { 
     versionMajor 6 
     versionMinor advancedVersioning.versionCode 
    } 
    codeOptions { 
     versionCodeType VersionCodeType.AUTO_INCREMENT_ONE_STEP 
    } 
} 

defaultConfig { 
    applicationId "com.my.app =" 
    minSdkVersion 15 
    targetSdkVersion 22 
    versionCode = advancedVersioning.versionCode 
    versionName = advancedVersioning.versionName 
} 

buildTypes { 
    def STRING = "String" 
    def URL = "URL" 
    release { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     signingConfig signingConfigs.releaseConfig 
    } 
    staging { 
     minifyEnabled true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
    } 
    development { 
     minifyEnabled false 
    } 
    debug { 
     minifyEnabled false 
    } 
} 
testOptions { 
    unitTests.returnDefaultValues = true 
} 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    compile 'com.android.support:appcompat-v7:22.2.0' 
    compile 'com.google.android.gms:play-services:4.2.+' 

    compile(name: 'library-release', ext: 'aar') 

    compile 'com.squareup.okhttp:okhttp:2.4.0' 
    compile 'com.google.code.gson:gson:2.3.1' 
    compile 'org.roboguice:roboguice:3.+' 
    provided 'org.roboguice:roboblender:3.+' 

    testCompile 'junit:junit:4.12' 
    testCompile 'org.mockito:mockito-core:1.10.19' 
    testCompile "org.robolectric:robolectric:3.0" 
} 

repositories { 
flatDir { 
    dirs 'libs' 
} 
} 

カスタムのGradleランナー

public class M1stRoboelectricGradleTestRunner extends RobolectricTestRunner { 
public M1stRoboelectricGradleTestRunner(Class<?> testClass) throws InitializationError { 
    super(testClass); 
    String buildVariant = (BuildConfig.FLAVOR.isEmpty() 
      ? "" : BuildConfig.FLAVOR+ "/") + BuildConfig.BUILD_TYPE; 
    String intermediatesPath = BuildConfig.class.getResource("") 
      .toString().replace("file:", ""); 
    intermediatesPath = intermediatesPath 
      .substring(0, intermediatesPath.indexOf("/classes")); 

    System.setProperty("android.package", 
      BuildConfig.APPLICATION_ID); 
    System.setProperty("android.manifest", 
      intermediatesPath + "/manifests/full/" 
        + buildVariant + "/AndroidManifest.xml"); 
    System.setProperty("android.resources", 
      intermediatesPath + "/res/merged/" + buildVariant); 
    System.setProperty("android.assets", 
      intermediatesPath + "/assets/" + buildVariant); 
} 

@Override protected AndroidManifest getAppManifest(Config config) { 

    String manifestProperty = System.getProperty("android.manifest"); 
    String resProperty = System.getProperty("android.resources"); 
    String assetsProperty = System.getProperty("android.assets"); 
    AndroidManifest manifest = new AndroidManifest(Fs.fileFromPath(manifestProperty), Fs.fileFromPath(resProperty), 
      Fs.fileFromPath(assetsProperty)){ 
    }; 
    manifest.setPackageName("com.my.app"); 
    return manifest; 
} 
} 

テストクラス

@RunWith(M1stRoboelectricGradleTestRunner.class) 
public class MainActivityTest { 
    private MainActivity mActivity; 
    private Button mButton; 
    private TextView mTextView; 

@Before 
public void setup() { 

    mActivity = Robolectric.buildActivity(
      MainActivity.class).create().get(); 
    mButton = (Button) mActivity.findViewById(R.id.signInButton); 
    mTextView = (TextView) mActivity.findViewById(R.id.linkContact); 
} 

問題: 次のコード行がエラーを投げているものです。

mActivity = Robolectric.buildActivity(
    MainActivity.class).create().get(); 

最初に、デフォルトのrobolectricGradleTestRunnerを使用しようとしましたが、ResourceNotFound com.my.app::string/app_nameが見つからないまま受け取りました。ばかげた量の記事やブログを閲覧した後、私はthisに出会い、カスタムランナーを実装することでそれを越えることができました。これはapp_nameの問題を解決しました。

android.content.res.Resources $ NotFoundException:いいえ、そのようなラベルコム

  1. は私が@config入れてテストクラス(SDK = 21)の場合、私は私 が最初に受信されたエラーが表示されます。 my.app:string/app_name at org.robolectric.util.ActivityController.getActivityTitle(ActivityController.java:104) at org.robolectric.util.ActivityController.attach(ActivityController.java:49) at org.robolectric.util .ActivityController $ 1.run(ActivityController.java:121) at org.robolectric.shadows.ShadowLooper.runPaused(ShadowLooper.java:304)(ActivityController.java:118) at org.robolectric.util.ActivityController.create(ActivityController(ActivityController.java:118) .java:129)sun.reflect.NativeMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) でorg.members1st.mobile.MainActivityTest.setup(MainActivityTest.java:32) (NativeMethodAccessorImpl.javaで 。 62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at org.junit.runners.model.FrameworkMethod $ 1。runReflectiveCall(FrameworkMethod.java:50) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) org.robolectric.RobolectricTestRunner $ 2.evaluate(RobolectricTestRunner.java:251)org.robolectric.RobolectricTestRunner.runChildで でorg.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) で (RobolectricTestRunner .java:188) at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54) at org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:290) at org.junit.runners.ParentRunner $ 1 .schedule(ParentRunner.java:71) at org.junit.runners.ParentRunner.runC組織でorg.junit.runners.ParentRunner $ 2.evaluateでorg.junit.runners.ParentRunner.access $ 000(ParentRunner.java:58) (ParentRunner.java:268) でhildren(ParentRunner.java:288) 。 org.junit.runner.JUnitCore.runでrobolectric.RobolectricTestRunner $ 1.evaluate org.junit.runners.ParentRunner.runで(RobolectricTestRunner.java:152) (ParentRunner.java:363) (JUnitCore.java:137) com.intellij.rt.execution.junitでcom.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)でcom.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78) で.JUnitStarter.main(JUnitStarter.java:68) at sun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド)com.intellij.rt.execution.application.AppMain.mainでsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) で(AppMain.java:140)

  2. 私は一人でSDKを残す場合は、

    1. カスタムBuildConfigの作成とthis robolectricスレッド上でその中につき 勧告を渡す:私はrobolectricは22

    は、これまでのところ、私が試したAPIに対応していません取得します。

  3. @configのpackageNameを推奨ごとにthis threadに設定します。同じエラーで以前のステップの結果の
  4. ほとんどすべての組み合わせをファイルに私のGradleで21にtargetSdkを設定するAPIレベル
  5. を送り返すための新しいApplicationManifestのオーバーロード
  6. 。 APP_NAMEは私が

    mActivity = Robolectric.setupActivity(MainActivity.class)を使用して試した

  7. を構築、テストによって生成されたvalues.xmlリソース・ファイルであることを確認済み

  8. 。代わりに実行されたときに

    mActivity = Robolectric.buildActivity(
        MainActivity.class).create().get(); 
    

    8.定期的なユニットテストが働いているの

+0

ヒント:質問のフォーマットを正しく行い、実際の質問を上に移動してみてください。 – natario

+0

驚くばかりのヒント - それをフレーズするより良い方法は何でしょうか? – aminner

+0

それは間違いを編集していますか、 'build.gradle'は実際には' applicationId "com.my.app =" 'ですか? –

答えて

2

を試してみましたので、これに対する解決は私のための顔の手のひらだったが、うまくいけば他の誰かに役立ちます。

packageNameは、で、はapplicationIdと同じです。ほとんどの例では同じですから、違いを捕まえていませんでした。上記で

、パッケージ名は、実際にorg.my.appだったが、それはすべてが美しく働い切り替えた後は、私のAPPLICATIONIDはcom.my.app

ました。そんなルーキーミス!

+0

packageNameはbuild.gradleのapplicationIdと同じです –

9

あなたは

@RunWith(RobolectricGradleTestRunner.class) 
@Config(constants = BuildConfig.class, sdk=21, packageName="com.my.app") 
public class MainActivityTest 
+0

ええ - 私はそれを試みたが、私は単純なばかげた間違いをしたことが判明した。 packageNameはapplicationIdではありませんが、すべての例では同じであるとみなされていたので、私は何も考えていませんでした。最後の溝の一部として変更を加え、うまくいきました。私の部分では愚かなミス。 – aminner

+0

ありがとうございます – emaleavil

+0

** sdk = 21 **の目的は何ですか? –

関連する問題