Articles of mockito

与Mockito间谍的Robolectric buildActivity()?

在我看来,使用Robolectric的生命周期实用程序构建一个Activityunit testing(从Robolectric.buildActivity() )并使用Robolectric.buildActivity()间谍监视相同的Activity是相互排斥的。 因为buildActivity()控制Activity对象的构造,所以在调用buildActivity()之后,为Activity添加间谍的唯一地方。 但是,在事后添加间谍时,间谍无法正常运作。 在监视ActivityController生命周期方法(如create() , start()和resume()副作用时尤其如此。 我假设这是因为ActivityController持有对“真正的”Activity对象的引用,而不是后来添加的间谍。 那么有没有办法窥探一个使用Robolectric进行unit testing的Activity,这样当通过Robolectric的ActivityController调用生命周期方法时,间谍是否正常工作?

如何使用Mockito模拟SharedPreferences

我刚刚阅读了Android中的单元仪表测试,我想知道如何在没有任何SharedPreferencesHelper类的情况下模拟SharedPreferences,就像这里一样 我的代码是: public class Auth { private static SharedPreferences loggedUserData = null; public static String getValidToken(Context context) { initLoggedUserPreferences(context); String token = loggedUserData.getString(Constants.USER_TOKEN,null); return token; } public static String getLoggedUser(Context context) { initLoggedUserPreferences(context); String user = loggedUserData.getString(Constants.LOGGED_USERNAME,null); return user; } public static void setUserCredentials(Context context, String username, String token) { initLoggedUserPreferences(context); loggedUserData.edit().putString(Constants.LOGGED_USERNAME, username).commit(); loggedUserData.edit().putString(Constants.USER_TOKEN,token).commit(); } […]

模拟方法调用使用power mockito – org.powermock.api.mockito.ClassNotPreparedException

我有一个图像加载器类,我需要测试一些静态方法。 由于Mockito不支持静态方法,我改用Power Mockito。 但我正在测试的静态方法有一个方法调用 Base64.encodeToString(byteArray, Base64.DEFAULT); 为了模拟这个,我使用如下的mockStatic方法和@PrepareForTest注释。 PowerMockito.mockStatic(Base64.class); 但Android工作室正在回复我仍然给我一个错误,如下所示。 org.powermock.api.mockito.ClassNotPreparedException:类android.util.Base64没有准备好测试。 要准备此类,请将类添加到“@PrepareForTest”注释中。 以下是我的完整代码。 要测试的代码: import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.util.Base64; import android.widget.ImageView; public static String convertBitmapToBase64(Bitmap imageBitmap, boolean withCompression) { ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); imageBitmap.compress(Bitmap.CompressFormat.PNG, 120, byteArrayOutputStream); byte[] byteArray = byteArrayOutputStream.toByteArray(); return Base64.encodeToString(byteArray, Base64.DEFAULT); } 测试类代码 import android.graphics.Bitmap; import android.util.Base64; import org.junit.Before; import org.junit.runner.RunWith; import […]

Androidunit testing中的Mock Retrofit Observable 响应

我有一个API接口,我正在测试涉及网络调用的View 。 @Config(emulateSdk = 18) public class SampleViewTest extends RobolectricTestBase { ServiceApi apiMock; @Inject SampleView fixture; @Override public void setUp() { super.setUp(); //injection is performed in super apiMock = mock(ServiceApi.class); fixture = new SampleView(activity); fixture.setApi(apiMock); } @Test public void testSampleViewCallback() { when(apiMock.requestA()).thenReturn(Observable.from(new ResponseA()); when(apiMock.requestB()).thenReturn(Observable.from(new ResponseB()); AtomicReference testResult = new AtomicReference(); fixture.updateView(new Callback() { @Override public […]

Android Jack mockito另类

也许还为时过早,但正如杰克和吉尔今天宣布的那样,我对此感到非常兴奋。 我真的很想去,但他们也说: 读取.class文件的各种工具(例如JaCoCo,Mockito和一些lint检查)目前与Jack编译器不兼容。 杰克编译器已有一个模拟替代品吗?

使用JUnit +的unit testing用例(Android中的Robolectric或Mockito或两者)

这是我第一次在Android中编写unit testing用例。 所以我搜索了很多东西。 Robolectric framewordk – 在JVM上运行 Mockito Framwork – 模拟物体 所以我对Robolectric和Mokito有些怀疑。 我是否必须在Android应用中仅使用Robolectric和JUnit? 我应该只在Android应用中使用Mockito吗? 我应该同时使用这两个框架吗? Mockito和Robolectric有什么区别? 我在寻找Mokito和Robolectric之间的区别,但没有得到任何正确的答案。 请建议。

使用Mockito 1.9.5和DexMaker-Mockito-1.0validationVerifyError

像许多其他人一样,我很高兴听到Mockito现在可以使用Android并按照本教程亲眼看到它。 一切似乎都是扇动的,我开始将模拟解决方案纳入我的Android测试项目…… 错误 但是,在设置我的应用程序的测试项目以利用mockito-all-1.9.5 , dexmaker-1.0和dexmaker-mockito-1.0 jar时,我遇到了第一个测试用例的问题。 事实上恰恰是这个问题 。 我想要帮助的部分是; 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.(Enhancer.java:70) 我被告知这“仅仅还不行”,因为堆栈跟踪意味着没有使用DexMaker jar – 引用此响应 。 但是,我怀疑我在项目设置方面做错了所以我想从这里的集体知识库中抽取来看看这确实是用户错误还是beta-bug。 我的Android测试项目设置 请在下面find我的测试项目配置的屏幕截图。 该项目是通过Android向导创建的,除了在libs目录下包含Mockito和DexMaker jar(如上所述)之外,没有共享任何特殊function。 考试 不要介意测试内容(测试在执行unit testing之前失败),设置如下所述; public class TestSpotRatingCalculator extends InstrumentationTestCase { @Mock private AService aService; // Changed […]

为什么在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()) […]