java.lang.NoClassDefFoundError: com/arellomobile/mvp/MoxyReflector when testing AAR
LolusKekus opened this issue · comments
Hello. I'm facedoff with problem when i'm trying to cover my AAR code with some tests.
some activity
public class DetailActivity extends MvpAppCompatActivity implements IDetailView {
@Inject
@InjectPresenter
DetailPresenter presenter;
@Override
public void showDetails() {
}
@Override
public void showTime() {
}
}
some presenter
@InjectViewState
public class DetailPresenter extends MvpPresenter<IDetailView> {
public DetailPresenter() {
}
public void showDetails() {
getViewState().showDetails();
}
}
presenter test
public class DetailPresenterTest extends ABaseTest<IDetailView, DetailPresenter> {
@Mock
IDetailView view;
@Before
public void setUp() {
super.setUp();
}
@Override
protected void initPresenter() {
presenter = new DetailPresenter();
presenter.attachView(view);
}
@Test
public void testDetails() {
presenter.showDetails();
verify(view).showDetails();
}
}
gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moxyReflectorPackage : 'com.example.testdaggerlibrary' ]
}
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
def moxy = "1.5.3"
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
androidTestCompile 'org.mockito:mockito-android:2.7.22'
testImplementation 'org.mockito:mockito-core:1.10.19'
compile 'com.google.dagger:dagger:2.9'
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
implementation "com.arello-mobile:moxy:$moxy"
annotationProcessor "com.arello-mobile:moxy-compiler:$moxy"
implementation "com.arello-mobile:moxy-android:$moxy"
implementation "com.arello-mobile:moxy-app-compat:$moxy"
}
When i'm starts testDetails from DetailPresenterTest it's fails with next exception:
java.lang.NoClassDefFoundError: com/arellomobile/mvp/MoxyReflector
at com.arellomobile.mvp.MvpPresenter$Binder.bind(MvpPresenter.java:163)
at com.arellomobile.mvp.MvpPresenter.<init>(MvpPresenter.java:28)
at com.example.testdaggerlibrary.presentation.presenters.DetailPresenter.<init>(DetailPresenter.java:17)
at com.example.testdaggerlibrary.DetailPresenterTest.initPresenter(DetailPresenterTest.java:30)
at com.example.testdaggerlibrary.ABaseTest.setUp(ABaseTest.java:22)
at com.example.testdaggerlibrary.DetailPresenterTest.setUp(DetailPresenterTest.java:25)
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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.mockito.internal.runners.JUnit45AndHigherRunnerImpl.run(JUnit45AndHigherRunnerImpl.java:37)
at org.mockito.runners.MockitoJUnitRunner.run(MockitoJUnitRunner.java:62)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
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.AppMainV2.main(AppMainV2.java:131)
Caused by: java.lang.ClassNotFoundException: com.arellomobile.mvp.MoxyReflector
at java.net.URLClassLoader.findClass(URLClassLoader.java:381)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 35 more
I noticed, when i remove from gradle file following pieces and rebuild AAR project then everything becomes normal
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moxyReflectorPackage : 'com.example.testdaggerlibrary' ]
}
}
but this gradle settings are necessary for AAR projects...
Thank you in advance for your answer.
Spending some time in research i found out a solution, that fits my demands.
I use productFlavors.
now gradle looks like this:
apply plugin: 'com.android.library'
android {
compileSdkVersion 26
defaultConfig {
minSdkVersion 19
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "default"
productFlavors {
unitTestsBuild {
dimension "default"
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moxyReflectorPackage : '' ]
}
}
}
lolBuild {
dimension "default"
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moxyReflectorPackage : 'com.example.testdaggerlibrary' ]
}
}
}
}
}
def moxy = "1.5.3"
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:26.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.1'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
androidTestCompile 'org.mockito:mockito-android:2.7.22'
testImplementation 'org.mockito:mockito-core:1.10.19'
compile 'com.google.dagger:dagger:2.9'
annotationProcessor 'com.google.dagger:dagger-compiler:2.9'
implementation "com.arello-mobile:moxy:$moxy"
annotationProcessor "com.arello-mobile:moxy-compiler:$moxy"
implementation "com.arello-mobile:moxy-android:$moxy"
implementation "com.arello-mobile:moxy-app-compat:$moxy"
}
When i want to start tests, i chouse unitTestsBuild in build Variants in Android Studio.