私は次のように静的関数をテストするために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)
誰もがこれについていくつかの光を共有できますか?私はグーグルをしていますが、良いリファレンスを見つけることができません。前もって感謝します。
ここで注目すべき所見があります。どこかで、ビルドによって生成されるAndroid.jarが原因であると読みました。
理由はわかりませんが、compileVersionを26から25に変更して(26または25では意味がありません。インストールされている別のバージョンに変更しただけです)、プロジェクトを再構築しようとしました。
同じテストケースが確実に再び機能し始めました。
今日も同じ問題がありました。何が起こったのかわかりませんが、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'
}
コメントがあまりなかったので、誰か助けてあげたいです。
JUnitテストがTypeNotPresentExceptionProxy例外をスローする理由の1つは、一部の依存関係が実装ではなくcompileOnlyを使用しているためです。
SDKバージョンのコンパイルが重要であるという理由は、SDKがモックしているクラスを削除したためかもしれません。