【问题标题】:VerifyError using Mockito 1.9.5 and DexMaker-Mockito-1.0使用 Mockito 1.9.5 和 DexMaker-Mockito-1.0 的验证错误
【发布时间】:2012-10-14 11:30:31
【问题描述】:

像许多其他人一样,我很高兴听到 Mockito now works with Android 并跟随 this tutorial 亲眼看到它。一切看起来都非常棒,我开始将模拟解决方案整合到我的 Android 测试项目中......

错误

但是,在设置我的应用程序的测试项目以利用 mockito-all-1.9.5dexmaker-1.0dexmaker-mockito-1.0 jar 时,我在第一个测试用例中遇到了问题。事实上,正是this problem。我需要帮助的部分是;

Caused by: java.lang.VerifyError: org/mockito/cglib/core/ReflectUtils
at org.mockito.cglib.core.KeyFactory$Generator.generateClass(KeyFactory.java:167)
at org.mockito.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)
at org.mockito.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:217)
at org.mockito.cglib.core.KeyFactory$Generator.create(KeyFactory.java:145)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:117)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)
at org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:105)
at org.mockito.cglib.proxy.Enhancer.<clinit>(Enhancer.java:70)

我被告知这个“还不能完全起作用”,因为堆栈跟踪暗示没有使用 DexMaker jar - 参考 this response。但是,我怀疑我在项目设置方面做错了什么,所以我希望从这里的集体知识库中吸取教训,看看这确实是用户错误还是 beta 错误。

我的 Android 测试项目设置

请在下面找到我的测试项目配置的屏幕截图。该项目是通过 Android 向导创建的,除了在 libs 目录下包含 Mockito 和 DexMaker jar(如上所述)之外,没有其他任何特殊功能。

测试

不管测试的内容(在执行单元测试之前测试失败)设置如下所述;

public class TestSpotRatingCalculator extends InstrumentationTestCase {
  @Mock
  private AService aService; // Changed the service names being used here - not important.
  @Mock
  private BService bService;
  @Mock
  private CService cService;
  @Mock
  private DService dService;

  /**
   * @see android.test.AndroidTestCase#setUp()
   */
  @Override
  protected void setUp() throws Exception {
    super.setUp();
    MockitoAnnotations.initMocks(this);  // Failure here with aforementioned stacktrace...
  }

如果有人知道出了什么问题,请在此处发出声音。

【问题讨论】:

  • 同意,dexmaker 似乎没有被使用,或者在运行时根本看不到。我不是 Android 开发人员,但这绝对是这里的情况。
  • 感谢@Brice - 这方面的任何帮助都很棒,让我有一些东西可以回馈给开发人员。我会向他们指出这个问题和你的评论,看看我们进展如何......
  • 只是一个帮助搜索者的说明...如果您尝试在Android 没有 dexmaker 的情况下使用Mockito,也会出现此处描述的错误。在这种情况下,将两个 dexmaker jar 添加到您的 libs/ 目录并构建类路径。
  • 你解决了吗?我有同样的问题stackoverflow.com/questions/24967050/…

标签: android junit mockito cglib dexmaker


【解决方案1】:

您好,我也遇到了同样的问题,我发现这篇文章非常有用!

http://corner.squareup.com/2012/10/mockito-android.html

关键信息是:

要在设备或模拟器上使用 Mockito,您需要添加三个 .jar 文件到您的测试项目的 libs 目录:mockito-all-1.9.5.jardexmaker-1.0.jardexmaker-mockito-1.0.jar

【讨论】:

  • 这是一个怎样的答案? OP 在问题中写道,他正在使用这三个罐子。
【解决方案2】:

只需将其添加到您的 gradle 中即可:

androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'

【讨论】:

  • 还有其他人在尝试此操作时收到 java.lang.IllegalArgumentException: dexcache == null 吗?
【解决方案3】:

我们刚刚在一个项目中遇到了同样的问题,但是我们在真实设备上的测试也失败了。

原因追踪到Mockito如何使用类加载器,导致LogCat出现如下错误:

W/ActivityThread(5777): ClassLoader.getResources: The class loader returned by Thread.getContextClassLoader() may fail for processes that host multiple applications. You should explicitly specify a context class loader. For example: Thread.setContextClassLoader(getClass().getClassLoader());

解决方法是在调用 mock() 测试之前显式设置类加载器,例如。

@Override
protected void setUp() throws Exception {
    super.setUp();
    Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
    fooImpl = mock(Foo.class)
}

Mockito 中有问题的文件是这个:org.mockito.internal.configuration.ClassPathLoader(1.9.5 中的第 121 行)

【讨论】:

  • 感谢您指出这一点!我在尝试模拟一个类时遇到了 java.lang.VerifyError,即使在包含 dexmaker jar 之后也是如此。这是使用 Mockito 1.9.5 完成的。将其添加到 setUp 方法可以消除错误。
【解决方案4】:

正如here 所暗示的那样,dexmaker-android 组合仅在针对真实设备运行插桩测试时才能 100% 工作。

在真实设备上运行测试不会出现此故障。

【讨论】:

  • 对我有用,上面至少有一位评论者。
【解决方案5】:

对于仍然有此错误的每个人,请检查您是否没有在依赖项中排除一个类。我们意外排除了 MockMaker.class,所以这就是异常的原因。

【讨论】:

    猜你喜欢
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多