Robolectric:运行多个测试失败

2024-02-13

我正在尝试运行多个测试Robolectric 3.0 + Gradle using SQLite(开放助手)作为数据库。 运行每个单独的测试都可以正常工作,但启动整个测试套件总是会导致第二个测试中出现 RuntimeException。

这是我的测试假人,它不起作用。

@RunWith(RobolectricGradleTestRunner.class)
@Config(constants = BuildConfig.class, sdk = 21)
public class Dummy {


    @Before
    public void setUp() throws Exception {
         // setup activity ...
    }

    @Test
    public void testA() throws Exception {
        Assert.assertTrue(true);
    }

    @Test
    public void testB() {
        Assert.assertTrue(true);
    }
}

例外

java.lang.RuntimeException: java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-4-thread-1,5,main] []
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:470)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativeResetStatementAndClearBindings(ShadowSQLiteConnection.java:286)
    at android.database.sqlite.SQLiteConnection.nativeResetStatementAndClearBindings(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.releasePreparedStatement(SQLiteConnection.java:915)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:519)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
    at de.d360.android.sdk.v2.storage.db.datasource.AbstractDataSource.insert(AbstractDataSource.java:78)
    at de.d360.android.sdk.v2.storage.db.datasource.QueueMessageDataSource.create(QueueMessageDataSource.java:100)
    at de.d360.android.sdk.v2.net.Queue.addToHttpQueue(Queue.java:185)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1636)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1612)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1651)
    at de.d360.android.sdk.v2.D360Events.appInstanceUpdated(D360Events.java:359)
    at de.d360.android.sdk.v2.crm.AppInstanceUpdater.sendUpdateEvent(AppInstanceUpdater.java:27)
    at de.android.hotel.HotelApplication.onCreate(HotelApplication.java:281)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:140)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:433)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:240)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
    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:152)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-4-thread-1,5,main] []
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getConnection(ShadowSQLiteConnection.java:333)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getStatement(ShadowSQLiteConnection.java:340)
    at org.robolectric.shadows.ShadowSQLiteConnection.stmt(ShadowSQLiteConnection.java:52)
    at org.robolectric.shadows.ShadowSQLiteConnection.access$000(ShadowSQLiteConnection.java:33)
    at org.robolectric.shadows.ShadowSQLiteConnection$16.call(ShadowSQLiteConnection.java:289)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$6.call(ShadowSQLiteConnection.java:452)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$6.call(ShadowSQLiteConnection.java:446)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

java.lang.RuntimeException: java.lang.RuntimeException: java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-4-thread-1,5,main] []
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:244)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
    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:152)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:78)
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:212)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.RuntimeException: java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-4-thread-1,5,main] []
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.execute(ShadowSQLiteConnection.java:470)
    at org.robolectric.shadows.ShadowSQLiteConnection.nativeResetStatementAndClearBindings(ShadowSQLiteConnection.java:286)
    at android.database.sqlite.SQLiteConnection.nativeResetStatementAndClearBindings(SQLiteConnection.java)
    at android.database.sqlite.SQLiteConnection.releasePreparedStatement(SQLiteConnection.java:915)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:519)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.__constructor__(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java)
    at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java)
    at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
    at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
    at de.d360.android.sdk.v2.storage.db.datasource.AbstractDataSource.insert(AbstractDataSource.java:78)
    at de.d360.android.sdk.v2.storage.db.datasource.QueueMessageDataSource.create(QueueMessageDataSource.java:100)
    at de.d360.android.sdk.v2.net.Queue.addToHttpQueue(Queue.java:185)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1636)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1612)
    at de.d360.android.sdk.v2.D360Events.sendEvent(D360Events.java:1651)
    at de.d360.android.sdk.v2.D360Events.appInstanceUpdated(D360Events.java:359)
    at de.d360.android.sdk.v2.crm.AppInstanceUpdater.sendUpdateEvent(AppInstanceUpdater.java:27)
    at de.android.hotel.HotelApplication.onCreate(HotelApplication.java:281)
    at org.robolectric.internal.ParallelUniverse.setUpApplicationState(ParallelUniverse.java:140)
    at org.robolectric.RobolectricTestRunner.setUpApplicationState(RobolectricTestRunner.java:433)
    at org.robolectric.RobolectricTestRunner$2.evaluate(RobolectricTestRunner.java:240)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:188)
    at org.robolectric.RobolectricTestRunner.runChild(RobolectricTestRunner.java:54)
    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:152)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:68)
    ... 1 more
Caused by: java.lang.IllegalStateException: Illegal connection pointer 1. Current pointers for thread Thread[pool-4-thread-1,5,main] []
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getConnection(ShadowSQLiteConnection.java:333)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections.getStatement(ShadowSQLiteConnection.java:340)
    at org.robolectric.shadows.ShadowSQLiteConnection.stmt(ShadowSQLiteConnection.java:52)
    at org.robolectric.shadows.ShadowSQLiteConnection.access$000(ShadowSQLiteConnection.java:33)
    at org.robolectric.shadows.ShadowSQLiteConnection$16.call(ShadowSQLiteConnection.java:289)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$6.call(ShadowSQLiteConnection.java:452)
    at org.robolectric.shadows.ShadowSQLiteConnection$Connections$6.call(ShadowSQLiteConnection.java:446)
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
    at java.util.concurrent.FutureTask.run(FutureTask.java:166)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:722)

已经尝试了一些解决方案,例如使用以下代码重置单例,该代码以 FieldNotfoundException 或 NullPointerException 结尾,因此不起作用。

@After
public void finishComponentTesting() {
    // sInstance is the static variable name which holds the singleton instance
    resetSingleton(MySQLiteOpenHelper.class, "sInstance");
}

private void resetSingleton(Class clazz, String fieldName) {
    Field instance;
    try {
        instance = clazz.getDeclaredField(fieldName);
        instance.setAccessible(true);
        instance.set(null, null);
    } catch (Exception e) {
        throw new RuntimeException();
    }
}

编辑:通过删除 D360Sdk 的 AppInstanceUpdater 的 sendUpdateEvent() 来修复它。

AppInstanceUpdater updater = D360Sdk.getCrmAppInstanceUpdater();
updater.setCustomId(Util.installId());
// updater.sendUpdateEvent();

这是一个老问题,但也许这个解决方案可以帮助某人,因为我面临类似的问题(完全相同的错误)。

问题是,在运行多个多次访问数据库的测试用例时,第一个测试用例打开与数据库的连接并且不会关闭它。当第二个测试用例尝试再次打开数据库连接时,它失败了。

我阅读了一些解决方案,最后发现问题出在多次打开数据库上。因此,要成功运行测试,请在您的TestCase.java文件(您编写测试用例的位置):

@Before
public void setUp() throws Exception {
    //Get an instance of your implementation of SQLiteOpenHelper class.
    //Let's assume the class name is MySQLiteHelper which extends SQLiteOpenHelper and has a function called getInstance
    //which returns the instance of the SQLiteOpenHelper.
    //Store this instance in a global variable in your TestCase.java file.
    databaseHelper = MySQLiteHelper.getInstance();
}

@After
public void tearDown() throws Exception {
    //use the instance created in setUp() function to close the database
    databaseHelper.close();
}

上述两个用“@Before”和“@After”注释的函数在每个测试用例之前和之后运行。因此,对于每个测试用例之后,我们应该关闭数据库连接。

This https://www.bountysource.com/issues/32208329-java-lang-runtimeexception-java-lang-illegalstateexception-illegal-connection-pointer-1-with-content-provider and this https://github.com/robolectric/robolectric/issues/2010链接有帮助。

如果解决方案有问题或者我对此错误的理解有误,请评论。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Robolectric:运行多个测试失败 的相关文章

随机推荐

  • 自加载时间起 10 秒后运行 PHP 脚本

    我正在建立一个网站 但我不明白一件事 我需要一个脚本来检查自加载时间以来是否已经过去 10 秒 然后它将运行另一个 PHP 脚本 但我不确定这是否可能 我已附上我对这个问题的尝试 有任何想法吗 提前致谢 if query SELECT FR
  • xCode 4 中的异常没有调用堆栈

    我遇到了一个例外 我无法回溯 我想知道哪里抛出了异常 xCode 4 2 中有这样的选项吗 正如您所看到的 调用堆栈并没有多大帮助 我唯一知道的是我正在尝试访问 NSArray 中错误索引处的项目 欢迎所有想法 谢谢 设置断点objc ex
  • 除非我使用超时,否则 CSS 过渡不起作用

    我有几节课 hide is display none and transparent is opacity 0 元素pr container has webkit transition opacity 1s 以下基于 JQuery 的代码使
  • 如何使用 http/ftp 将文件上传到 iphone/ipad? (例如 ifile、goodreader)

    关于将文件上传到设备有什么好的建议吗 我见过很多应用程序在 80 或 8080 上创建 http 服务器来上传文件 这是否意味着我也必须实现服务器 有第三方库吗 最好是开源且非 GPL 编辑 我将在企业环境中为特定设备升级应用程序中的文件
  • 如何使用 glDebugMessageControl

    这是基于来自的调试回调示例https www khronos org opengl wiki Debug Output https www khronos org opengl wiki Debug Output并在某种程度上https l
  • 以 Django 作为后端的 Android/iOS 应用程序

    我有一个用 Django 构建的网站项目 想为其构建一个移动应用程序 我做了很多研究 但很困惑native and hybrid应用程序 我的项目基本上是 Quora 的克隆 只是一个大学项目 我也看到了PhoneGap Ionic and
  • UIAlertAction 值列表

    我试图弄清楚如何更改 UIAlertAction 标题的字体类型 我假设 可以通过为特定键设置值来完成 例如 要设置图像 您可以这样做 action setValue image forKey image 是否有所有可用密钥的列表 我不知道
  • 有没有比 () => 更好的方式来表达无参数 lambda?

    The 看起来很傻 有没有更好的办法 例如 ExternalId IfNotNullDo gt ExternalId ExternalId Trim 有点 城里有一个新的习语 它很好 在某些情况下可能对你有帮助 这并不完全是你想要的 但有时
  • 模拟器 Nexus 7 使用布局文件夹而不是layout-sw600dp

    我正在尝试处理不同屏幕的布局 但我发现这很困难 因为模拟器总是使用默认布局 我不明白为什么 我创建了一个 Nexus 7 模拟器 并希望使用layout sw600dp 与 Nexus 10 模拟器相同 怎么来的 提前致谢 R Nexus
  • 如何从PostgreSQL数据库获取角色的评论

    给定角色名称someone 如何获取用子句定义的注释 COMMENT ON ROLE someone IS THIS IS A ROLE COMMENT 查找如何检索此类信息的一个好方法是查看帮助psql并找到将显示此信息的命令 在这种情况
  • 有没有办法在 SymPy 中处理常量函数参数?

    我正在生成符号函数并使用 SymPy 来简化它们 现在我想要一种方法来 简化 表示尚未拟合的函数中的常量参数的符号 例如 如果我生成一个多项式 我可能会生成一个像这样的字符串 C x x C x C x C SymPy 会变成 C x 2
  • Laravel 5.5 如何在关系中添加动态条件?

    我有一个关系 可以让在特定日期创建的朋友使用静态日期参数 public function friends return this gt hasMany Friend class gt where created at 2018 01 31
  • printf 中的可变大小填充

    有没有办法在中使用可变大小的填充printf 我有一个整数表示填充有多大 void foo int paddingSize printf MyText paddingSize 这应该打印出来 MyText其中 paddingSize 应决定
  • 使用日期时间索引提高大熊猫 read_csv 的速度

    我有巨大的文件 如下所示 05 31 2012 15 30 00 029 130 6 25 1 E 0 1306 25 05 31 2012 15 30 00 029 130 6 25 8 E 0 1306 25 我可以使用以下内容轻松阅读
  • 我可以将 NativeActivity 与 ActivityGroup 一起使用吗?

    I know ActivityGroup已弃用 但我正在尝试结合用户界面NativeActivty带有一些 Java Android APIViews 我正在尝试制作一个混合用户界面 其中屏幕的一部分来自NativeActivity 我用这
  • Python 中变量参数列表的默认值

    是否可以在 Python 3 中为变量参数列表设置默认值 就像是 def do it args 2 5 21 pass 我想知道变量参数列表的类型tuple但这里不接受任何元组 如果语法上没有 那么取决于你想要什么行为 def do it
  • 使用 TryGetProperty 时忽略大小写

    我有一个 JsonElement 类型的对象 其中包含 API 返回的数据 我想获取某个属性的值 但问题是 TryGetProperty 区分大小写 有没有办法或解决方法可以按名称获取属性 同时忽略大小写 谢谢 EnumerateObjec
  • Django - 如何使用 URL 中定义的外键创建 POST?

    我想知道如何创建具有定义 ID 的对象 POST 假设我有一个实例表User有柱子id name和桌子Object有柱子id id users sth where id users是一个外键id from User桌子 我想要一个这样的网址
  • 如何更改iOS模拟器保存截图的目录?

    从 iOS 模拟器保存屏幕截图时 屏幕截图会保存到桌面 拍了一些之后 我的桌面很快就被不属于那里的屏幕截图污染了 如何更改iOS模拟器截图的保存目录 在一些与屏幕截图存储位置相关的问题中 评论者回应说 默认情况下 它们存储在桌面上 暗示它可
  • Robolectric:运行多个测试失败

    我正在尝试运行多个测试Robolectric 3 0 Gradle using SQLite 开放助手 作为数据库 运行每个单独的测试都可以正常工作 但启动整个测试套件总是会导致第二个测试中出现 RuntimeException 这是我的测