Articles of mockito

为什么在Java中使用静态辅助方法不好?

我问,因为我正在尝试使用一个模拟框架(Mockito),它不允许你模拟静态方法。 调查一下,我发现有不少博客文章说你应该尽可能少的静态方法,但我很难理解为什么。 特别是为什么不修改全局状态的方法基本上是辅助方法。 例如,我有一个名为ApiCaller的类,它有几个静态方法。 静态方法的一个目的是执行HTTP调用,处理我们的服务器可能返回的任何自定义问题(例如用户未登录)并返回响应。 简化,例如: public class ApiCaller { … public static String makeHttpCall(Url url) { // Performs logic to retrieve response and deal with custom server errors … return response; } } 要使用这一切,我所要做的就是调用ApiCaller.makeHttpCall(url)现在我可以很容易地将它ApiCaller.makeHttpCall(url)非静态方法,如: public class ApiCaller { … public String makeHttpCall(Url url) { // Performs logic to retrieve response and deal with custom […]

需要帮助使用Mockito和JUnit4编写unit testing

需要帮助使用Mockito和JUnit4为以下代码编写unit testing, public class MyFragmentPresenterImpl { public Boolean isValid(String value) { return !(TextUtils.isEmpty(value)); } } 我试过以下方法:MyFragmentPresenter mMyFragmentPresenter @Before public void setup(){ mMyFragmentPresenter=new MyFragmentPresenterImpl(); } @Test public void testEmptyValue() throws Exception { String value=null; assertFalse(mMyFragmentPresenter.isValid(value)); } 但它返回以下exception, java.lang.RuntimeException:未模拟android.text.TextUtils中的方法isEmpty。 有关详细信息,请参阅http://g.co/androidstudio/not-mocked 。 在android.text.TextUtils.isEmpty(TextUtils.java)….

如何正确窥探活动

当一些东西被监视时,Mockito会创建一个代理实例。 现在,有没有办法将在该代理实例上执行的setter转发到它后面的实例? 理由:我有一个对象实例,我没有完全在我的控制之下,即Android活动。 我可以给我的应用程序的大多数部分代理版本,并且运行良好, 但因为我需要在活动的创建阶段很早就创建间谍/代理,它尚未完全实例化,例如基础上下文是不附加。 这发生在代理实例上,当然不被活动实例本身使用(它通过Activity.this引用它自己)。 最终的结果是,这会导致各种崩溃,因为资源解析是通过这个基础上下文发生的,因此内部Fragment机制会抛出NPE等等。 这是一些代码: public class CustomAndroidJUnitRunner extends AndroidJUnitRunner { @Override public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Activity activity = super.newActivity(cl, className, intent); return maybeStubSomeDelegate(activity); } private Activity maybeStubSomeDelegate(Activity activity) { if (!(activity instanceof SomeDelegate)) { return activity; } Activity spiedActivity = spy(activity); doReturn(SomeDelegateMock.getInstance()) […]

如何在Log中模拟方法e

这里Utils.java是我要测试的类,以下是在UtilsTest类中调用的方法。 即使我正在嘲笑Log.e方法,如下所示 @Before public void setUp() { when(Log.e(any(String.class),any(String.class))).thenReturn(any(Integer.class)); utils = spy(new Utils()); } 我收到以下exception java.lang.RuntimeException: Method e in android.util.Log not mocked. See http://g.co/androidstudio/not-mocked for details. at android.util.Log.e(Log.java) at com.xxx.demo.utils.UtilsTest.setUp(UtilsTest.java:41) 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 […]

在“Mockito文档”中,“SRPy”代表什么?

从http://docs.mockito.googlecode.com/hg/org/mockito/Mockito.html 像往常一样,您将阅读部分模拟警告:面向对象编程通过将复杂性划分为单独的,特定的SRPy对象来解决更复杂的问题。 部分模拟如何适应这种模式? 那么,它只是不…部分模拟通常意味着复杂性已被转移到一个不同的方法对同一个对象。 在大多数情况下,这不是您想要devise应用程序的方式。

与Mockito的Android仪器testing

我试图使用Android仪器testingMockito框架,但我不能正确初始化它。 我有以下testing类: class MainKontorTest extends ActivityInstrumentationTestCase2<MainActivity> { @Mock Dependency bar; @Override public void setUp() { super.setUp(); MockitoAnnotations.initMocks(this); } public void testSomething() { Foo foo = new Foo(bar); } } 当我尝试运行这个testing时,我得到以下错误和stacktrace: java.lang.ExceptionInInitializerError 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。在org.mockito.internal.MockAnnotationProcessor的org.mockito.Mockito.Mock(Mockito.java:1285)上的org.mockito.internal.MockitoCore.mock(MockitoCore.java:59)上的createMock(MockUtil.java:33) (org.mockito.internal.configuration.DefaultAnnotationEngine.createMockFor(DefaultAnnotationEngine.java:43)org.mockito.internal.configuration.MockAnnotationProcessor.process(MockAnnotationProcessor.java:16)处理(MockAnnotationProcessor.java:33)。 mockito.internal.configuration.DefaultAnnotationEngine.process(DefaultAnnotationEn (org.mockito.java:66)org.mockito.internal.configuration.InjectingAnnotationEngine.processIndependentAnnotations(InjectingAnnotationEngine.java:71)org.mockito.internal.configuration.InjectingAnnotationEngine.process(InjectingAnnotationEngine.java:55)at org.mockito.MockitoAnnotations .initMocks(MockitoAnnotations.java:108)at junit.framework.TestCase.runBare(TestCase.java:132)at junit.framework。org.arkadiy.moduledeleationsample.ui.main.MainKontorTest.setUp(MainKontorTest.java:20)。 TestResult $ 1.protect(TestResult.java:115)at android.support.test.internal.runner.junit3.AndroidTestResult.runProtected(AndroidTestResult.java:77)at junit.framework.TestResult.run(TestResult.java:118)at android.support.test.internal.runner.junit3.AndroidTestResult.run(AndroidTestResult.java:55),位于android.support.test.internal.runner.junit3的junit.framework.TestCase.run(TestCase.java:124)。 NonLeakyTestSuite $ NonLeakyTest.run(NonLeakyTestSuite.java:63)在junit.framework.TestSuite.runTest(TestSuite.java:24 3)在android.support.test.internal.runner的android.support.test.internal.runner.junit3.DelegatingTestSuite.run(DelegatingTestSuite.java:103)上的junit.framework.TestSuite.run(TestSuite.java:238) .org.junit.runners.Suite.runChild(Suite.java)中的。 […]

unit testing的改装2 api呼叫与Mockito

我需要一些关于如何嘲笑restapi的build议。 我的应用程序是在MVP架构。 我的API接口: public interface MyAPI { @GET("{cmd}/{userName}/{password}") Observable<Response> login( @Path("cmd") String cmd, @Path("userName") String userName, @Path("password") String password ); 我的服务: public class MyService implements IService { private static MyService mInstance = new MyService(); private MyAPI mApi; public static MyService getInstance() { return mInstance; } private MyService() { OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); httpClientBuilder.connectTimeout(Config.DEFAULT_TIMEOUT, TimeUnit.SECONDS); […]

如何让Powermock与Dexmaker合作

我正在尝试使用以下build.gradleconfiguration将Powermock作为我的Androidtesting的依赖项: 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' } } 然而,编译器抱怨说 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 看着jar结构,我注意到Dexmaker和Powermock MockMaker在mockito-extensions声明了MockMaker 什么是MockMaker? 他们有什么不同? 而最重要的问题是:是否有可能使Powermock与Dexmaker很好地协作? 提前致谢。 任何帮助将不胜感激。

当在Android中侦听LinkedList时java.lang.AbstractMethodError

我想要窥探Android中的链表。 List list = new LinkedList(); List spyData = Mockito.spy(list); spyData.add("xxxx"); 但是,发生exception。 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) libs的依赖关系是 dexmaker-1.2.jar dexmaker-mockito-1.2.jar mockito-core-1.10.19.jar 即使我更新mockito-core-1.10.19.jar到mockito-core-2.0.31-beta.jar , 问题依然存在。 但Mockito.mock(Linkedlist.class)是好的,我没有关于这个问题的想法。 谢谢。

mockito和eclipse的configuration问题。 给出错误:java.lang.verifyError

当我将我的mockito库添加到类path,并使用一个简单的mockito示例进行testing,我尝试通过使用模拟对象尝试返回错误的函数添加值,我得到java.lang.verifyerror。 以下是用于testing的代码,其次是logcat。 @Test public void testadd() { maincode obj2=mock(maincode.class); when(obj2.add(0, 0)).thenReturn(9); assertEquals(obj2.add(0, 0),9); } 我得到以下错误。 请帮忙! 谢谢。 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)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)位于org.mockito.cglib.core.KeyFactory.create(KeyFactory.java:109)位于org.mockito.cglib.core.KeyFactory.create(KeyFactory.java: 105)在org.mockito.internal.creation.jmock.ClassImposterizer.createProxyClass(ClassImposterizer.java:85)org.mockito.internal.creation。org.mockito.cglib.proxy.Enhancer。(Enhancer.java:70)。在org.mockito.internal.creation.jmock.ClassImposterizer.imposterise(ClassImposterizer.java:56)上的jmock.ClassImposterizer.imposterise(ClassImposterizer.java:62)at org.mockito.internal.creation.CglibMockMaker.createMock (CglibMockMaker.java:23)在org.mockito.internal.util.MockUtil.createMock(MockUtil.java:26)在org.mockito.internal.MockitoCore.mock(MockitoCore.java:51)在org.mockito.Mockito。模拟(Mockito.java:1243)在org.mockito.Mockito.mock(Mockito.java:1120)在testaddmock.testadd(testaddmock.java:24)在java.lang.reflect.Method.invokeNative(本地方法)在android .test.AndroidTestRunner.runTest(AndroidTestRunner.java:191)在android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:176)在android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:554)在android.app.Instrumentation $ InstrumentationThread.run(Instrumentation.java:1701)