代码之家  ›  专栏  ›  技术社区  ›  Vansi

ArrayStoreException:太阳。反映注释。TypeNotPresentExceptionProxy android PowerMock JUnit

  •  9
  • Vansi  · 技术社区  · 8 年前

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

    stacktrace如下所示。

        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)
    

    提前谢谢。

    3 回复  |  直到 8 年前
        1
  •  2
  •   Maychell Fernandes    7 年前

    compileSdkVersion , buildToolsVersion targetSdkVersion 匹配 support-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
  •  1
  •   Vansi    8 年前

    不知道原因,但我尝试将compileVersion从26更改为25(在26或25中没有意义。我只是更改为随我安装的另一个版本。)重建项目。

    同样的测试用例重新开始工作,没有失败。

        3
  •  1
  •   Weidian Huang    6 年前

    因为编译SDK版本很重要,可能是因为SDK删除了您正在模拟的类。