web-dev-qa-db-fra.com

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

J'utilise PowerMock avec Mockito pour tester une fonction statique comme suit. Cela fonctionnait bien jusqu'à aujourd'hui il lève cette exception mentionnée ci-dessous.

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

Et le stacktrace est comme suit.

    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)

Quelqu'un peut-il partager un peu de lumière à ce sujet. Je suis en train de googler mais je ne trouve pas une bonne référence. Merci d’avance.

7
Vansi

J'ai une observation à noter ici. Quelque part, j’ai lu que c’est dû à Android.jar qui est généré par la construction. 

Je ne connais pas la raison, mais j'ai essayé de changer la version compileVersion de 26 à 25 (aucune signification en 26 ou 25. Je viens de changer pour une autre version installée avec moi.) Et de reconstruire le projet. 

Les mêmes cas de test ont recommencé à fonctionner sans échec.

1
Vansi

J'ai eu le même problème aujourd'hui. Je ne sais pas trop ce qui s'est passé, mais en mettant à jour les variables compileSdkVersion, buildToolsVersion et targetSdkVersion pour les faire correspondre à la version support-annotations, le problème a disparu.

Maintenant, le build.gradle ressemble à:

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'
}

Je n'ai pas pu trouver beaucoup de commentaires à ce sujet, alors j'espère pouvoir aider quelqu'un.

2
Maychell Fernandes

Une raison possible pour laquelle le test Junit génère une exception TypeNotPresentExceptionProxy est due au fait que certaines dépendances utilisent compileOnly au lieu de l'implémentation.

Parce que la compilation de la version du SDK est importante, c'est peut-être parce que le SDK a supprimé les classes dont vous vous moquez.

0
Weidian Huang