android Robolectric buildActivity()with Mockito spy?

7d7tgy0s  于 2023-11-15  发布在  Android
关注(0)|答案(3)|浏览(150)

在我看来,用Robolectric的生命周期工具(从Robolectric.buildActivity()开始)构建Activity单元测试和用Mockito间谍监视同一Activity是相互排斥的。
由于buildActivity()控制Activity对象的构造,因此只能在调用buildActivity()之后为Activity添加间谍。但是,在此之后添加间谍时,它无法正常工作。
在监视ActivityController生命周期方法(如create()start()resume())的副作用时尤其如此。我假设这是因为ActivityController持有对“真实的”Activity对象的引用,而不是后来添加的spy。
那么,有没有什么方法可以监视一个正在使用Robolectric进行单元测试的Activity,以便在通过Robolectric的ActivityController调用生命周期方法时,间谍可以正常工作?

cuxqih21

cuxqih211#

答案是使用反射来替换ActivityController中的“真实的”Activity对象。

  1. @Test
  2. public void someTestMethod() throws NoSuchFieldException, IllegalAccessException {
  3. ActivityController<LoginActivity> ac = Robolectric.buildActivity(LoginActivity.class);
  4. LoginActivity spiedActivity = spy(ac.get());
  5. replaceComponentInActivityController(ac, spiedActivity);
  6. ac.create();
  7. // do your work
  8. }
  9. public static void replaceComponentInActivityController(ActivityController<?> activityController, Activity activity)
  10. throws NoSuchFieldException, IllegalAccessException {
  11. Field componentField = ComponentController.class.getDeclaredField("component");
  12. componentField.setAccessible(true);
  13. componentField.set(activityController, activity);
  14. }

字符串
我用Robolectric 3.1测试了一下,没问题。

展开查看全部
b4qexyjb

b4qexyjb2#

至少对于Activity不是被测对象,而只是托管被测片段的虚拟Activity的情况,可以将mock注入测试Activity,该测试Activity可以通过片段和Activity之间的通信接口验证与Activity的交互(遵循http://developer.android.com/training/basics/fragments/communicating.html)。

0tdrvxhp

0tdrvxhp3#

不反思。我想十年也不算晚吧?

  1. @Test
  2. fun testRefreshButtonPressed() {
  3. ActivityController.of(spy(MyActivity::class.java), Intent(), Bundle.EMPTY).use { controller ->
  4. val activity = controller.setup().get()
  5. assertNotNull(activity.binding.refresh)
  6. assertEquals(View.VISIBLE, activity.binding.refresh.visibility)
  7. activity.binding.refresh.performClick()
  8. verify(activity).startService(any()) // It works
  9. }
  10. }

字符串
ActivityController说:
强烈建议不要直接在测试中使用ActivityController。
但恕我直言,这比反思要少得多。

展开查看全部

相关问题