【问题标题】:Cannot instantiate OrmLite helper in a unit test class in Android Studio无法在 Android Studio 的单元测试类中实例化 OrmLite 助手
【发布时间】:2016-03-28 14:38:20
【问题描述】:

这是我的代码:

@RunWith(MockitoJUnitRunner.class)
public class OrmLiteTest {

    OrmLiteDatabaseHelper databaseHelper;

    @Mock
    Context mMockContext;

    @Before
    public void setup() {
        mMockContext = Mockito.mock(Context.class);
        databaseHelper = OpenHelperManager.getHelper(mMockContext,
                OrmLiteDatabaseHelper.class);
    }

运行测试时出现以下异常:

java.lang.IllegalStateException: Could not construct instance of helper class class com.example.myapp.application.OrmLiteDatabaseHelper
    at com.j256.ormlite.android.apptools.OpenHelperManager.constructHelper(OpenHelperManager.java:222)
    at com.j256.ormlite.android.apptools.OpenHelperManager.loadHelper(OpenHelperManager.java:170)
    at com.j256.ormlite.android.apptools.OpenHelperManager.getHelper(OpenHelperManager.java:78)
    at com.bulatsa.despark.OrmLiteTest.setup(OrmLiteTest.java:39)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    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: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 com.intellij.rt.execution.application.AppMain.main(AppMain.java:140)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.j256.ormlite.android.apptools.OpenHelperManager.constructHelper(OpenHelperManager.java:220)
    ... 31 more
Caused by: java.lang.NullPointerException
    at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.openFileId(OrmLiteSqliteOpenHelper.java:310)
    at com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.<init>(OrmLiteSqliteOpenHelper.java:76)
    at com.bulatsa.despark.application.OrmLiteDatabaseHelper.<init>(OrmLiteDatabaseHelper.java:28)
    ... 36 more

【问题讨论】:

  • 你想测试什么?我认为你的方法不对
  • 我想创建一些产品,然后产品照片,将它们相互关联,然后删除产品,看看产品照片是否与它们一起被删除。为此,我需要 OrmLite DB Helper。
  • 也许这对你有帮助stackoverflow.com/questions/2095695/…
  • 哇,Android 很痛苦。必须使用需要模拟器或设备的其他类型的测试,这很慢。
  • 模拟器测试完全不同。您从所有代码的单元测试开始,然后进行集成测试,然后在模拟器上进行测试。跳过其中一个只是痛苦学习的一种方式。是的,好的测试很难,但你会掌握它的窍门。

标签: android


【解决方案1】:

您正试图在 OrmLiteSqliteOpenHelper.java 中为空的对象上调用方法(或类似方法),第 310 行

由于您没有分享该代码,我们只能这么说......

原因:java.lang.NullPointerException 在 com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper.openFileId(OrmLiteSqliteOpenHelper.java:310)

哦,还有那行……

 mMockContext = Mockito.mock(Context.class);

...应该删除,因为@RunWith(MockitoJUnitRunner.class) 已经在那里注入了一个模拟,不需要手动创建一个。

【讨论】:

  • 我认为是上下文为空,因为同一行代码在我的Android项目中正常情况下工作,所以这意味着我无法正确实例化上下文?
  • 我不知道,因为我看不到代码。您在那里生成的上下文不是空的,所以我个人猜测,那里有一个像 context.getXYZ().doSomething(); 这样的构造 - 这会导致 NPE,因为您的模拟上下文不知道在调用 getXYZ() 时要返回什么, 所以它会返回 null - 然后你尝试调用 doSomething。你可能需要另一个模拟和像Mockito.when( context.getXYZ()).thenReturn( mockOfXYZ() );这样的行
猜你喜欢
  • 2017-05-16
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-25
相关资源
最近更新 更多