2017-11-23 16 views
1

Roboletric과 함께 몇 가지 테스트를 실행하고 있지만 해결할 수없는 문제가 발생했습니다. 내가 테스트를 실행하면 다음과 같은 오류는 "AndroidManifest를"로 나타납니다Robolectric : "AndroidManifest.xml을 찾을 수 없음"및 "리소스 ID # 0x7f09001b를 찾을 수 없습니다"

경고 :.에서 찾을 수 없습니다 매니페스트 파일을 \의 AndroidManifest.xml.

Android OS 리소스에만 적용됩니다. 이 경고를 제거하려면 @Config (manifest = 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); 나는이 문제에 감각을 보지 못했다 나를 위해

...

세부 사항 :

  • 테스트 클래스는 폴더에 : app\src\test\java\com\example\robertoassad

  • 테스트는 다음과 같습니다. @RunWith(RobolectricTestRunner.class) public class Roboletric { 여기 1,232,

     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을 찾습니다.
  • 은 자바 리소스 폴더

  • 빌드/중간/매니페스트/[전체 또는 패스트 스타트]/[구축 형]

그래서 그것이 일반적인 실수는을 지정합니다 소스 코드 폴더 구성 (예 : 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 자원 폴더에 넣고 resources 폴더의 상대 경로에 따라 @Config를 지정하십시오.

0

응용 프로그램에서 라이브러리 모듈을 테스트하는 중도 동일한 문제가 발생했습니다.

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(); 
    } 
} 

및 테스트에 사용 : 이제 내 Receievers 및 서비스 그래서 사람들을 테스트하기 위해, 내 라이브러리에, 나는 Roboelectric 내 라이브러리 매니페스트가 아닌 앱 매니페스트를 가리킬 수 있도록 사용자 정의 테스트 클래스를 구현했다 같은 종류 :

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

나는 당신이 직면하는 것과 비슷한 문제가있었습니다. 이에 대한 Robolectric GitHub 문제의 post by jongerrish은이 문제를 해결해주었습니다.

나를 위해 일한 대답의 측면은 내 모듈의 build.gradle 파일에 testOptions 블록을 추가했다 :

testOptions { 
    unitTests { 
     includeAndroidResources = true 
    } 
} 

이 내 테스트 실행 및 액세스 문자열 리소스 할 수 있었다 차단 추가 한 후.