web-dev-qa-db-ja.com

ArrayStoreException:Sun.reflect.annotation.TypeNotPresentExceptionProxy Android PowerMock JUnit

私は次のように静的関数をテストするためにMockitoでPowerMockを使用しています。それは今日までうまく機能していましたが、以下に述べるこの例外をスローしています。

// this test case need to mock static methods so it uses PowerMock
@RunWith(PowerMockRunner.class)
// this static methods to be mocked are on Environment so that must be 'prepared'
@PrepareForTest({Environment.class, Build.class, Build.VERSION.class})
public class FileUtilityUnitTest {
    //This uses the JUnit TemporaryFolder Rule to create
    // (and discard on completion) a directory for the assertions.
    @Rule
    TemporaryFolder storageDirectory = new TemporaryFolder();
    File nonExistentDirectory;
    File existentDirectory;

    @Before
    public void setup(){
        PowerMockito.mockStatic(Environment.class);
        PowerMockito.mockStatic(Build.VERSION.class);
        nonExistentDirectory = Mockito.mock(File.class);
        //so the exists method tends to be false
        when(nonExistentDirectory.exists()).thenReturn(false);
        existentDirectory = storageDirectory.getRoot();
    }

    @Test
    public void test_is_external_storage_writable(){
        when(Environment.getExternalStorageState()).thenReturn(Environment.MEDIA_MOUNTED);
        assertTrue("External storage mounted ", Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED);
    }
}

そして、スタックトレースは次のとおりです。

    Internal Error occured.
Java.lang.ArrayStoreException: Sun.reflect.annotation.TypeNotPresentExceptionProxy
    at Sun.reflect.annotation.AnnotationParser.parseClassArray(AnnotationParser.Java:724)
    at Sun.reflect.annotation.AnnotationParser.parseArray(AnnotationParser.Java:531)
    at Sun.reflect.annotation.AnnotationParser.parseMemberValue(AnnotationParser.Java:355)
    at Sun.reflect.annotation.AnnotationParser.parseAnnotation2(AnnotationParser.Java:286)
    at Sun.reflect.annotation.AnnotationParser.parseAnnotations2(AnnotationParser.Java:120)
    at Sun.reflect.annotation.AnnotationParser.parseAnnotations(AnnotationParser.Java:72)
    at Java.lang.Class.createAnnotationData(Class.Java:3521)
    at Java.lang.Class.annotationData(Class.Java:3510)
    at Java.lang.Class.getAnnotation(Class.Java:3415)
    at com.intellij.junit4.JUnit4TestRunnerUtil.buildRequest(JUnit4TestRunnerUtil.Java:150)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:93)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.Java:42)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.Java:262)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.Java:84)
    at Sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at Sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.Java:62)
    at Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.Java:43)
    at Java.lang.reflect.Method.invoke(Method.Java:498)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.Java:147)

誰もがこれについていくつかの光を共有できますか?私はグーグルをしていますが、良いリファレンスを見つけることができません。前もって感謝します。

8
Vansi

ここで注目すべき所見があります。どこかで、ビルドによって生成されるAndroid.jarが原因であると読みました。

理由はわかりませんが、compileVersionを26から25に変更して(26または25では意味がありません。インストールされている別のバージョンに変更しただけです)、プロジェクトを再構築しようとしました。

同じテストケースが確実に再び機能し始めました。

1
Vansi

今日も同じ問題がありました。何が起こったのかわかりませんが、compileSdkVersionbuildToolsVersiontargetSdkVersionsupport-annotationsバージョン、問題はなくなりました。

build.gradleは次のようになります:

Android {
  compileSdkVersion 27
  buildToolsVersion "27.0.2"

  defaultConfig {
    ...
    targetSdkVersion 27
  }
}

dependencies {
  compile 'com.Android.support:support-annotations:27.0.2'
  androidTestCompile 'com.Android.support:support-annotations:27.0.2'
}

コメントがあまりなかったので、誰か助けてあげたいです。

2

JUnitテストがTypeNotPresentExceptionProxy例外をスローする理由の1つは、一部の依存関係が実装ではなくcompileOnlyを使用しているためです。

SDKバージョンのコンパイルが重要であるという理由は、SDKがモックしているクラスを削除したためかもしれません。

0
Weidian Huang