使用Mockito 1.9.5和DexMaker-Mockito-1.0验证VerifyError

Oce*_*ife 19 junit android mockito cglib dexmaker

像许多其他人一样,我很高兴听到Mockito现在可以使用Android并按照本教程亲眼看到它.一切似乎都是扇动的,我开始将模拟解决方案纳入我的Android测试项目...

错误

然而,在建立我的应用程序的测试项目,以充分利用mockito-all-1.9.5,dexmaker-1.0而且dexmaker-mockito-1.0罐子我遇到一个问题,我的第一个测试案例.事实上恰恰是这个问题.我想要帮助的部分是;

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)
Run Code Online (Sandbox Code Playgroud)

我被告知这个"还没有完全奏效",因为堆栈跟踪意味着没有使用DexMaker jar - 引用此响应.但是,我怀疑我在项目设置方面做错了所以我想从这里的集体知识库中抽取来看看这确实是用户错误还是beta-bug.

我的Android测试项目设置

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

测试项目配置

考试

不要介意测试内容(测试在执行单元测试之前失败),设置如下所述;

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...
  }
Run Code Online (Sandbox Code Playgroud)

如果有人知道有什么问题,那么请在这里发声.

Shi*_*hae 12

嗨我有同样的问题,我发现这篇文章非常有用!

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

关键信息是:

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

  • 这是怎么回答的?OP在使用这三个罐子的问题中写道. (3认同)

use*_*522 9

只需在您的gradle中添加:

androidTestCompile 'org.mockito:mockito-core:1.10.8'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
Run Code Online (Sandbox Code Playgroud)


Chr*_*ior 5

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

跟踪原因是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());
Run Code Online (Sandbox Code Playgroud)

修复是在调用mock()测试之前显式设置类加载器,例如.

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

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


Oce*_*ife 2

正如此处所暗示的,当针对真实设备运行仪器测试时,dexmaker-android 组合只能 100 %工作

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

  • 对我和上面至少一位评论者来说是这样。 (4认同)