46

我看到我不是唯一一个遇到这个问题的人,但我没有找到正确的答案。我有一个要测试的 android 项目。我为项目的每个类创建了一个 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 需要一个对象上下文,因此我创建了一个模拟(使用模拟)。我也尝试了一个对象 MockContext ,但它不起作用。

这是我的 Java 构建路径:

  • mockito-all-1.9.5.jar
  • 安卓 2.1 -> android.jar
  • Android 依赖项 -> annotations.jar
  • Junit 3 -> junit.jar
4

4 回答 4

84

不确定我是否遇到与您相同的问题,但我正在使用 gradle,由于某种原因,测试不再运行,出现与您相同的错误。我尝试清洁和重建,但无济于事。经过数小时的沮丧并试图找到答案后,我在 GitHub 线程中发现了一个简单的解决方案:

我通过删除项目中的 .gradle 文件夹并重建项目解决了这个问题。

(感谢 vpetrov)

于 2017-03-02T10:27:39.203 回答
32

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

于 2017-03-22T09:20:46.900 回答
20

按照以下步骤修复了该问题-

1.打开模块级build.gradle文件,进入依赖项,进入这一行——

testImplementation 'junit:junit:4.12'

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

testImplementation 'junit:junit:4.10'

3.同步项目

4.在我的情况下,此时已解决的问题

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

testImplementation 'junit:junit:4.12'

6.同步项目

更改 junit 版本和同步项目在我的情况下有效。

于 2019-04-10T20:56:44.177 回答
0

Robolectric 4.4 版似乎不支持 jdk 14。所以我可以切换到 jdk 13 或将 robolectric 更新为 4.5-alpha-1

于 2020-11-01T15:48:20.200 回答