Java.lang.NoClassDefFoundError:Android和JUnit测试

49

我看到不止我一个人遇到了这个问题,但我没有找到正确的答案。我有一个安卓项目想要进行测试。我为项目中的每个类创建了一个junit测试类。我的问题是当我运行测试时,出现以下错误:

java.lang.NoClassDefFoundError: android/content/Context

这是我的班级测试:

public class DevicesBDDTest extends TestCase {

    DevicesBDD bdd;

    /**
     * @throws java.lang.Exception
     */
    protected static void setUpBeforeClass() throws Exception {
    }

    /**
     * @throws java.lang.Exception
     */
    protected static void tearDownAfterClass() throws Exception {
    }

    protected void setUp() throws Exception {
        super.setUp();
        Context ctx = mock(Context.class);
        final MaBaseSQLiteInterface mockMaBaseSQLite = mock(MaBaseSQLiteInterface.class);
        bdd = new DevicesBDD(ctx){
            @Override
            public MaBaseSQLiteInterface createMaBaseSQlite(Context context) {
                return mockMaBaseSQLite;
            }
        };
    }


    protected void tearDown() throws Exception {
        super.tearDown();
    }

    public void test() {
        assertEquals(1, 1);
    }
}

我的 DevicesBDD 类需要一个 Context 对象,因此我使用 mockito 创建了一个模拟对象。我也尝试使用 MockContext 对象,但是它不起作用。

这是我的 Java Build Path:

  • mockito-all-1.9.5.jar
  • Android 2.1 -> android.jar
  • Android Dependencies -> annotations.jar
  • Junit 3 -> junit.jar

可能在类路径中找不到上下文,尝试将其jar文件添加到类路径中。 同时,Context是一个抽象类,您可以将其扩展为匿名类并使用它... 在错误和结构上提供更多细节。 - Dipak
尝试使用EasyMock.Create而不是mock。 - Dipak
在构建路径中,我有:
  • mockito-all-1.9.5.jar
  • Android 2.1(带有android.jar)
  • Andoird依赖项
  • JUnit3
通常,类Context应该在Android库中,不是吗?
- helene
@user1836315 通常 Android 应用程序的单元测试是在 Android 设备的上下文中运行的。这就是为什么当您运行普通的 JUnit 测试时,与 Android SDK 相关的类不会自动出现在构建路径上的原因。因此,Context 无法被识别。 - Boris Strandjev
1
OK. 我已经成功解决了我的问题,通过运行 Android Junit 测试,并在我的 Android 测试项目的 libs/ 文件夹中添加 mockito-all-1.9.5.jar。

我有一个新的错误,可能是由 mockito 引起的:java.lang.ExceptionInInitializerError at org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:85) at org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:62) ...
- helene
显示剩余3条评论
5个回答

88

不确定是否和您遇到的问题一致,但我正在使用gradle,在某些情况下测试无法正常运行,而且出现了与您相同的错误。我尝试过清理和重新构建,但都没有用。经过数小时的挫败和寻找答案后,在GitHub的一个帖子中,我找到了简单的解决方案:

我通过删除项目中的.gradle文件夹并重新构建项目来解决此问题。

(感谢vpetrov)


太好了。我在升级到Android Studio 2.3后遇到了这个问题。删除 .gradle/ 文件夹解决了这个问题。 - Nicolás Arias
1
哇,它终于可以工作了。我差点就要撞墙了。谢谢你。如果出现问题,请先删除.gradle邪恶文件:D - Ajay Shrestha
非常感谢你,我的朋友。 - prago
3
为了明确表述,以下是对我有效的步骤:退出Android Studio,删除.gradle文件夹,重新打开Android Studio并尝试操作。 - Luke

33

您可以在终端中运行 ./gradlew clean test


如果您正在使用Android Studio,您可以将其作为Gradle任务运行。 - Erigami

20

按照以下步骤解决问题 --

1.打开模块级别的build.gradle文件,进入dependencies,找到这一行 --

testImplementation 'junit:junit:4.12'

2.将junit版本更改为低于当前版本的任何其他版本(例如4.10)

testImplementation 'junit:junit:4.10'

3.同步项目

4.在我的情况下,这个问题已经得到解决

5.如果需要的话(在我的情况下为4.12),将JUnit版本设置回之前的版本

testImplementation 'junit:junit:4.12'

6.同步项目

在我的情况下,更改junit版本并同步项目可以解决问题。


1
对我有用。谢谢! - LukeWaggoner
6
对我有效,但这到底是什么巫术??这是什么鬼东西? - Kevin
对我没有用。'junit:junit:4.13'被更改为'junit:junit:4.12',同步后又改回'junit:junit:4.13',运行测试但仍然出现相同的错误。 - Tajuddin Khandaker
@TajuddinKhandaker 尝试在切换到4.12和4.10后运行测试。 - Mohit Atray

1
在我的情况下,我不得不从org.jetbrains.kotlinx:kotlinx-coroutines-test:1.73更改为org.jetbrains.kotlinx:kotlinx-coroutines-test:1.6.4

0

Robolectric 4.4 版本似乎不支持 JDK 14。因此,我可以切换到 JDK 13 或升级 Robolectric 到 4.5-alpha-1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接