2017-11-23 21 views
1

Roboletricでいくつかのテストを行っていますが、解決できない問題が出てきました。Robolectric: "AndroidManifest.xmlが見つかりませんでした"と "リソースID#0x7f09001bが見つかりません"

WARNING::。\のAndroidManifest.xmlで見つかりませんでしたマニフェストファイル私は、テストを実行すると 、次のエラーが「AndroidManifest」と表示されます。

Android OSのリソースにのみ戻っています。この警告を削除するには、@Config(マニフェスト= Config.NONE)を使用してテストクラス に注釈を付けます。

はありません、このようなマニフェストファイル:。

@Config (manifest = Config.DEFAULT_MANIFEST_NAME) 

@Config(manifest = Config.NONE, constants = BuildConfig.class, sdk = 26) 

@Config(constants = BuildConfig.class, manifest="src/main/AndroidManifest.xml", sdk = 26) 

をし、実行中に他のエラーがある:

\ AndroidManifest.xmlを

私はに失敗したこれらのソリューションを試してみました

android.content.res.Resources $ NotFoundException:見つかりません リソースID#0x7fパッケージで09001b [アンドロイド、org.robolectric.default]

com.example.robertoassad.alltestsmerge.MainActivity.onCreateで

...

(MainActivity.java:52)

エラーを持っているこの行は、次のコードです:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

具体的中:setContentView(R.layout.activity_main);私はこの問題では意味を見ていない私にとっては

...

DETAILS:

  • テストクラスは、フォルダにある:app\src\test\java\com\example\robertoassad

  • 試験は: @RunWith(RobolectricTestRunner.class) public class Roboletric { @Test public void clickingLogin_shouldStartLoginActivity() { MainActivity activity = Robolectric.setupActivity(MainActivity.class); activity.findViewById(R.id.button2).performClick();

     Intent expectedIntent = new Intent(activity, SecondActivity.class); 
         Intent actual = ShadowApplication.getInstance().getNextStartedActivity(); 
         assertEquals(expectedIntent.getComponent(), actual.getComponent()); 
        } 
    

    }

+0

robolectricで動作するテストはありますか? –

+0

ASで実行しますか? –

+0

@LeandroOcampoいいえ... –

答えて

1

ここでは、この問題のいくつかの時間のためのバグ私を、とは私のテストコードで私のノートです。

Gradleのビルドシステムで

マニフェストの場所について、Robolectricは次の順序でのAndroidManifest.xmlを探します。

  • Javaリソースフォルダ

  • ビルド/中間体/マニフェスト/ [フルまたはファスト・スタート]/[式の構築]

だから、指定するよくある間違いですソースコードのフォルダ構成(例:src/main/AndroidManifest.xml)に従ってAndroidManifest.xmlの場所。指定されたAndroidManifest.xmlの場所は、Robolectricがマージされたリソースを探す方法にも影響します。そのため、テストでリソースが見つからない場合は、おそらくAndroidManifest.xmlの場所が正しく設定されていない可能性があります。

つまり、Android GradleプラグインはAndroidManifest.xmlをマージし、その結果を上記の中間体ディレクトリに入れます。 src/main/AndroidManifest.xmlの内容はテスト結果に影響します。

@Configでマニフェストオプションを指定する場合は、@Config(manifest = "AndroidManifest.xml")を使用するだけで大​​丈夫です。別のAndroidManifest.xmlを使用する場合は、Javaリソースフォルダに配置し、リソースフォルダ内の相対パスに従って@Configを指定します。

0

アプリからライブラリモジュールをテストする際にも同じ問題が発生しました。今私のReceieversおよびサービスは、ので、それらをテストするために、自分のライブラリーにあり、私はRoboelectricは、マイライブラリのマニフェストではなく、アプリのマニフェストを指すことができるように、カスタムテストクラスを実装する必要がありました:

import android.os.Build; 
import org.junit.runners.model.InitializationError; 
import org.robolectric.manifest.AndroidManifest; 
import org.robolectric.RobolectricTestRunner; 
import org.robolectric.annotation.Config; 
import org.robolectric.res.Fs; 

import java.io.File; 
import java.io.IOException; 

public class RobolectricGradleTestRunner extends RobolectricTestRunner { 
    private static final String PROJECT_DIR = 
      "C:/MyProject/"; 


    private static final int MAX_SDK_SUPPORTED_BY_ROBOLECTRIC = 
      Build.VERSION_CODES.JELLY_BEAN_MR2; 

    public RobolectricGradleTestRunner(final Class<?> testClass) throws Exception { 
     super(testClass); 
    } 

    private static AndroidManifest getAndroidManifest() { 

     String manifestPath = PROJECT_DIR+"/src/main/AndroidManifest.xml"; 
     String resPath = PROJECT_DIR+"/src/main/res"; 
     String assetPath = PROJECT_DIR+"/src/main/assets"; 

     System.out.print("manifest path: "+manifestPath); 
     System.out.print("resPath path: "+resPath); 
     System.out.print("assetPath path: "+assetPath); 

     return new AndroidManifest(
       Fs.fileFromPath(manifestPath), Fs.fileFromPath(resPath), Fs.fileFromPath(assetPath)) { 
      @Override public int getTargetSdkVersion() { 
       return MAX_SDK_SUPPORTED_BY_ROBOLECTRIC; 
      } 
     }; 
    } 

    private static String getProjectDirectory() { 
     String path = ""; 
     try { 
      File file = new File(".."); 
      path = file.getCanonicalPath(); 
      path = path + "/app/"; 
     } catch (IOException ex) {} 
     return path; 
    } 

    @Override public AndroidManifest getAppManifest(Config config) { 
     return getAndroidManifest(); 
    } 
} 

し、テストでそれを使用しますクラスのような:

@RunWith(RobolectricGradleTestRunner.class) 
public class MyClassChangeTest { 
} 
1

私はあなたが直面しているものと同様の問題がありました。 Robolectric GitHub号のpost by jongerrishは、この問題を解決しました。

私のために働いた答えの側面は、私のモジュールのbuild.gradleファイルにtestOptionsブロックを追加しました:これは私のテストを実行することができましたし、アクセス文字列リソースブロック追加した後

testOptions { 
    unitTests { 
     includeAndroidResources = true 
    } 
} 

関連する問題