android - 使用 SugarORM 和 Robolectric 进行测试

标签 android testing robolectric sugarorm

我正在尝试为我的 android 项目设置测试环境。基本的 Robolectric 设置已完成。我用这个很好 tutorial .如果我在我的 Manifest.xml 中注释掉 SugarORM,所有测试都可以正常工作。但是如果我想将它与 SugarORM 一起使用,我总是会收到此错误:

java.lang.NullPointerException at dalvik.system.DexFile$DFEnum.hasMoreElements(DexFile.java:239) at com.orm.SugarDb.getDomainClasses(SugarDb.java:37) at com.orm.SugarDb.createDatabase(SugarDb.java:104) at com.orm.SugarDb.onCreate(SugarDb.java:100) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.orm.Database.getDB(Database.java:18) at com.orm.SugarApp.onTerminate(SugarApp.java:16) at org.robolectric.internal.ParallelUniverse.tearDownApplication(ParallelUniverse.java:133) at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:246) 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.robolectric.RobolectricTestRunner$1.evaluate(RobolectricTestRunner.java:158) at org.junit.runners.ParentRunner.run(ParentRunner.java:363) at org.junit.runner.JUnitCore.run(JUnitCore.java:137) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)

大家都有同样的问题吗?

编辑

也许是的,因为 Robolectric 在测试后关闭并且 sugarorm 仍然没有完成。我的测试类

@RunWith(RobolectricTestRunner.class)
@Config(manifest="./src/main/AndroidManifest.xml",emulateSdk=18)
public class MyActivityTest{

    private ActivityController<OnLogActivity> controller = Robolectric.buildActivity(OnLogActivity.class).create().setup();

    @Test
    public void clickingLogin_shouldStartLoginActivity() {
        OnLogActivity activity = controller.get();
        assertTrue(activity.findViewById(R.id.login) instanceof Button);

    }

}

编辑 2.0:

Robolectric 可以找到 android:name=com.orm.SugarApp 您必须使用与 com.orm 相同的包创建一个测试文件夹并添加一个名为 TestSugarApp 的测试类。之后你可以测试所有的东西。

package com.orm;

...

@RunWith(RobolectricTestRunner.class)
@Config(manifest="./src/main/AndroidManifest.xml",emulateSdk=18)
public class TestSugarApp extends Application
        implements TestLifecycleApplication {

    private ActivityController<OnLogActivity> controller;


    @Test
    public void startEverTestSugarAppAsFirst() {

    }

    @Override
    public void beforeTest(Method method) {
        Log.v("test", "beforeTest");
    }

    @Override
    public void prepareTest(Object test) {
        Log.v("test", "prepareTest");
    }

    @Override
    public void afterTest(Method method) {
        Log.v("test", "afterTest");
    }
}

最佳答案

好的,接下来试试。将下一个类添加到您的测试代码中:

public class TestSugarApp
    extends SugarApp
{
    @Override
    public void onCreate() {}

    @Override
    public void onTerminate() {}
}

名为 Test 的类将由 Robolectric 加载和使用,您可以覆盖一些与测试无关的东西。我试图阻止在 onCreateonTerminate ( https://github.com/satyan/sugar/blob/master/library/src/com/orm/SugarApp.java ) 中从 SugarApp 执行代码。

关于android - 使用 SugarORM 和 Robolectric 进行测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27964666/

相关文章:

android - 如何修复 "Unable to obtain result of ' adb 版本'“?

android - 将 Google 项目迁移到 Firebase 控制台

ruby-on-rails - 具有相同代码的 2 个测试之间的 Rspec 不一致结果

android - 如何从 Robolectric 测试 Action Bar 的 Action Items?

android - 测试驱动开发::AndroidStudio + Robolectric(Can not resolve symbol error for junit and Robolectric imports)

android - 如何以编程方式删除下载管理器android中的通知

android - 如何在 Android 中创建自定义控件?

android - 如何在应用计费中将测试帐户购买与android中的实际购买分开?

android - uiatomator包smack不存在报错

java - 配置 Gradle + Robolectric