Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

java.lang.NoClassDefFoundError: com/arellomobile/mvp/MoxyReflector when testing AAR #223

Open
LolusKekus opened this issue Sep 4, 2018 · 1 comment

Comments

@LolusKekus
Copy link

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.

@LolusKekus
Copy link
Author

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.

sergevalevich pushed a commit to sergevalevich/Moxy-Multimodule that referenced this issue Mar 3, 2019
…n module.

This allows Instant App support (Arello-Mobile#209),
running unit-tests for feature modules (Arello-Mobile#223)
and other issues Arello-Mobile#224.

Here, Moxy always references to MoxyReflector by com.arellomobile.mvp package and generates
MoxyReflectorDelegate for each module.

In order to use Moxy, there is no need to follow instructions described on this page https://github.com/Arello-Mobile/Moxy/wiki/Multiple-modules

Now it is only required to add 1 line of code to BaseActivity.onCreate of each module : MoxyReflector.registerDelegate(MoxyReflectorDelegate.INSTANCE);
sergevalevich pushed a commit to sergevalevich/Moxy-Multimodule that referenced this issue Jul 22, 2019
…n module.

This allows Instant App support (Arello-Mobile#209),
running unit-tests for feature modules (Arello-Mobile#223)
and other issues Arello-Mobile#224.

Here, Moxy always references to MoxyReflector by com.arellomobile.mvp package and generates
MoxyReflectorDelegate for each module.

In order to use Moxy, there is no need to follow instructions described on this page https://github.com/Arello-Mobile/Moxy/wiki/Multiple-modules

Now it is only required to add 1 line of code to BaseActivity.onCreate of each module : MoxyReflector.registerDelegate(MoxyReflectorDelegate.INSTANCE);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant