Android测试教程9--聊聊配置测试环境的一些问题

最近学测试的时候,遇到一些配置上的问题,在这里都写下来

testCompile , androidTestCompile 与 compile

写测试的时候遇到这两个配置,一时间没明白,查了下,是这样的

testCompile 'org.mockito:mockito-all:1.10.19'
androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
compile 'com.google.dexmaker:dexmaker-mockito:1.1'
  • 1
  • 2
  • 3

testCompile这个配置项是用来给我们的单元测试的,对应于目录的src/test 
androidTestCompile 这个是用来给我们测试api的,对应于目录是src/androidTest

这两者的主要区别是: 
前者是允许在一般的Java JVM的,可以做脱离设备的测试 
后者是运行在我们的安卓设备或者虚拟机上的情况

这里写图片描述

另外还有一些的编译配置

这里写图片描述

Compile 
这个最常见,再github看到的那些都是这样的形式 
compile是对所有的build type以及favlors都会参与编译并且打包到最终的apk文件中。

Provided 
Provided是对所有的build type以及favlors只在编译时使用,类似eclipse中的external-libs,只参与编译,不打包到最终apk。

APK 
只会打包到apk文件中,而不参与编译,所以不能再代码中直接调用jar中的类或方法,否则在编译时会报错

Test compile 
Test compile 仅仅是针对单元测试代码的编译编译以及最终打包测试apk时有效,而对正常的debug或者release apk包不起作用。

Debug compile 
Debug compile 仅仅针对debug模式的编译和最终的debug apk打包。

Release compile 
Release compile 仅仅针对Release 模式的编译和最终的Release apk打包。

===============================================

mockito

在使用这个来做mock的时候,遇到一个更加难受的问题 
如果编译依赖只有这个的话

   androidTestCompile 'org.mockito:mockito-all:1.10.19'
  • 1
  • 2

会遇到下面这个问题

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)
at org.mockito.internal.creation.cglib.ClassImposterizer.createProxyClass(ClassImposterizer.java:95)
at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:57)
at org.mockito.internal.creation.cglib.ClassImposterizer.imposterise(ClassImposterizer.java:49)
at org.mockito.internal.creation.cglib.CglibMockMaker.createMock(CglibMockMaker.java:24)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:33)
at org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)
at org.mockito.Mockito.mock(Mockito.java:1285)
at org.mockito.Mockito.mock(Mockito.java:1163)
at com.example.sanjay.myapplication.activity.MainActivityTest.setUp(MainActivityTest.java:56) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

stackoverflow说是要加多这个

androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
  • 1
  • 2
  • 3

实际加了之后,还是不行,编译都过,呵呵呵呵。

Error:Execution failed for task ':app:transformClassesWithDexForDebugAndroidTest'.
> com.android.build.api.transform.TransformException: 
com.android.ide.common.process.ProcessException: 
org.gradle.process.internal.ExecException: Process 'command 'C:\Program 
Files\Java\jdk1.8.0_60_64bit\bin\java.exe'' finished with non-zero exit value 2
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

索性只是保留这两个,又有下面的问题

java.lang.IllegalArgumentException: dexcache == null
 (and no default could be found; consider setting the
  'dexmaker.dexcache' system property)
  • 1
  • 2
  • 3
  • 4

真的给跪了。

又是StackOverFlow的一个答案,在SetUp()里面加多这个。

System.setProperty(
    "dexmaker.dexcache",
    getInstrumentation().getTargetContext().getCacheDir().getPath());
  • 1
  • 2
  • 3
  • 4

成功通过 
成功通过 
成功通过 
成功通过

参考: 
Confused about testCompile and androidTestCompile in android gradle 
Android Studio中有六种依赖

猜你喜欢

转载自my.oschina.net/u/1177694/blog/1626861