我想在我的Android项目中使用Mockito.我找到了非常好的教程来处理它:http://www.paulbutcher.com/2012/05/mockito-on-android-step-by-step/
基本上它使用新版本的Mockito + Dexmaker,一切都按预期工作.
但是,当我尝试模拟一些Android特定对象时,即:
Context context = mock(Context.class);
Run Code Online (Sandbox Code Playgroud)
我收到这个例外:
java.lang.IllegalArgumentException:
dexcache == null (and no default could be found;
consider setting the 'dexmaker.dexcache' system property)
at com.google.dexmaker.DexMaker.generateAndLoad(DexMaker.java:359)
at com.google.dexmaker.stock.ProxyBuilder.buildProxyClass(ProxyBuilder.java:252)
at com.google.dexmaker.mockito.DexmakerMockMaker.createMock(DexmakerMockMaker.java:54)
at org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)
Run Code Online (Sandbox Code Playgroud)
知道怎么解决吗?
像许多其他人一样,我很高兴听到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向导创建的,除了在目录下包含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 …
Run Code Online (Sandbox Code Playgroud) 所以我有一个Database类,它有一个扩展SQLOpenHelper的依赖项,我正在测试使用Android检测测试和Mockito来模拟依赖项.我们注意到Mockito实际上并没有Mockito.mock(class)
在实际代码运行时嘲笑实现,并且正如我们所期望的那样抛出空指针异常.在API 19设备上,测试按预期运行,并且模拟正常工作.
有没有人有任何建议或事情要尝试?我尝试过具有类似结果的真实设备和模拟器.这可能是一个Mockito问题,还是一个dex-maker问题?我在搜索时没有找到任何信息.
经过一些更多的测试,我用Mockito模拟的任何类实际上只是使用了实现.这是我的依赖项
androidTestCompile 'org.mockito:mockito-core:1.10.19'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.2'
Run Code Online (Sandbox Code Playgroud)
注意:如果这有任何区别,这也在库模块中.
我正在尝试使用以下build.gradle配置将Powermock作为我的Android测试的依赖项:
dependencies{
compile 'com.android.support:appcompat-v7:21.0.+'
androidTestCompile('org.mockito:mockito-core:1.9.5')
androidTestCompile('com.google.dexmaker:dexmaker:1.2')
androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2')
androidTestCompile('org.powermock:powermock-module-junit4:1.5.5') {
exclude module: 'junit'
}
androidTestCompile('org.powermock:powermock-api-mockito:1.5.5') {
exclude module: 'mockito-all'
}
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器抱怨说
Error:Gradle: Execution failed for task ':app:packageDebugTest'.
> Duplicate files copied in APK mockito-extensions/org.mockito.plugins.MockMaker
File 1: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar
File 2: ~/.gradle/caches/modules-2/files-2.1/com.google.dexmaker/dexmaker-mockito/1.2/b99884a4c6ef6335ba376f79aa79632b2421c17c/dexmaker-mockito-1.2.jar
Run Code Online (Sandbox Code Playgroud)
展望罐子结构,我注意到Dexmaker和Powermock都宣布MockMaker
在mockito-extensions
什么是MockMaker?他们有什么不同?最重要的问题是:是否有可能让Powermock与Dexmaker很好地合作?
提前致谢.任何帮助将不胜感激.
我想窥探android中的Linkedlist.
List list = new LinkedList();
List spyData = Mockito.spy(list);
spyData.add("xxxx");
Run Code Online (Sandbox Code Playgroud)
但是,发生了异常.
java.lang.AbstractMethodError: abstract method "boolean org.mockito.internal.invocation.AbstractAwareMethod.isAbstract()"
at org.mockito.internal.invocation.InvocationImpl.callRealMethod(InvocationImpl.java:109)
at org.mockito.internal.stubbing.answers.CallsRealMethods.answer(CallsRealMethods.java:41)
at org.mockito.internal.handler.MockHandlerImpl.handle(MockHandlerImpl.java:93)
at org.mockito.internal.handler.NullResultGuardian.handle(NullResultGuardian.java:29)
at org.mockito.internal.handler.InvocationNotifierHandler.handle(InvocationNotifierHandler.java:38)
at com.google.dexmaker.mockito.InvocationHandlerAdapter.invoke(InvocationHandlerAdapter.java:49)
at LinkedList_Proxy.add(LinkedList_Proxy.generated)
at com.app.test.testmethod(mytest.java:202)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1858)
Run Code Online (Sandbox Code Playgroud)
libs的依赖关系是
dexmaker-1.2.jar
dexmaker-mockito-1.2.jar
mockito-core-1.10.19.jar
Run Code Online (Sandbox Code Playgroud)
即使我更新mockito-core-1.10.19.jar
到mockito-core-2.0.31-beta.jar
,
问题依然存在.
但是Mockito.mock(Linkedlist.class)
没关系,我对这个问题没有任何想法.
谢谢.
我试图让Mockito(1.9.5 rc1)在我的Android测试中工作(使用Robotium).为了让它在DVM上运行,我将dexmaker.jar和dexmaker-mockito.jar(v 0.9)放在test-project的类路径中.
在Eclipse中作为Android JUnit测试进行测试后运行:
package com.stampay.pos.test;
import roboguice.RoboGuice;
import android.app.Application;
import com.jayway.android.robotium.solo.Solo;
import com.stampay.pos.activities.HomeActivity;
import com.stampay.pos.model.Consumer;
import com.stampay.pos.util.ScannerAndroid;
import static org.mockito.Mockito.*;
public class HomeActivityTest extends ActivityTest<HomeActivity> {
private Solo solo;
Application app;
public HomeActivityTest() {
super(HomeActivity.class);
}
@Override
public void setUp() throws Exception {
solo = new Solo(getInstrumentation(), getActivity());
}
@Override
public void tearDown() throws Exception {
solo.finishOpenedActivities();
RoboGuice.util.reset();
}
public void testScan() throws Exception {
ScannerAndroid scanner = (ScannerAndroid) getActivity().getScannerHelper();
Consumer mockConsumer = mock(Consumer.class);
//scanner.generateResult("consumer1");
}
}
Run Code Online (Sandbox Code Playgroud)
我得到以下堆栈跟踪: …
我有一些android测试,当在4.4/Kitkat下的Android版本上运行时会崩溃.
这些是我在build.gradle中的库
androidTestCompile 'org.mockito:mockito-core:1.9.5'
androidTestCompile 'com.google.dexmaker:dexmaker:1.1'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.1'
Run Code Online (Sandbox Code Playgroud)
虽然我需要添加一些提示来告诉Dexmaker将缓存放在哪里,但测试运行与Android 4.4版本一样正常.
System.setProperty("dexmaker.dexcache", getInstrumentation().getContext().getCacheDir().getPath());
Run Code Online (Sandbox Code Playgroud)
以下是设备的logcat输出:
D/dalvikvm( 1712): GC_FOR_ALLOC freed 479K, 19% free 2532K/3124K, paused 3ms, total 3ms D/dalvikvm( 1712): GC_CONCURRENT freed 427K, 18% free 2595K/3136K, paused 1ms+0ms, total 3ms D/dalvikvm( 1712): GC_CONCURRENT freed 311K, 16% free 2686K/3188K, paused 3ms+0ms, total 4ms D/dalvikvm( 1712): GC_FOR_ALLOC freed 127K, 11% free 2852K/3188K, paused 1ms, total 1ms D/dalvikvm( 1712): GC_FOR_ALLOC freed 123K, 7% free 3239K/3476K, paused 4ms, total 4ms D/dalvikvm( 1712): GC_CONCURRENT freed 53K, 6% free …