android-robolectric-如何在创建Activity对象时模拟和注入业务类

android-robolectric-如何在创建Activity对象时模拟和注入业务类,第1张

概述我的任务是为现有的Android活动编写单元测试,并且未编写符合单元测试(紧密耦合)的代码.场景:我有一个StroageManager类,该类正在MyActivityonCreate方法中实例化.@OverrideprotectedvoidonCreate(BundlesavedInstanceState){StorageManagerstoragemanager

我的任务是为现有的Android活动编写单元测试,并且未编写符合单元测试(紧密耦合)的代码.

场景:我有一个StroageManager类,该类正在MyActivity onCreate方法中实例化.

@OverrIDeprotected voID onCreate(Bundle savedInstanceState) {             StorageManager storagemanager = GetStorageManager(); // return new object of stroage manager super.onCreate(savedInstanceState);.....    ...}

为了通过Robolectric创建活动实例,我需要在测试中在设置MyActivity之前对其进行模拟.

问题:如何通过robolectric创建myActivity对象时如何模拟和注入该模拟对象

注意:这是现有的Activity,我没有很大的自由来修改Activity代码以进行大范围扩展.另外,我们正在使用Mockito框架进行模拟,因此,如果您使用Mockito进行示例,那将很棒.

这是我尝试在Mockito中使用Robolectric的示例代码,但无法正常工作:

@RunWith(RobolectricTestRunner.class)public class myActivityTest {    @Mock    private StorageManager storageManager;    @InjectMocks    MyActivity myActivity;    @Before    public voID setUp() {        ActivityController<MyActivity> activityController = Robolectric.buildActivity(MyActivity.class);        myActivity = activityController.get();       // when(registrationActivity.GetMetricManager()).thenReturn(mock(MetricsManager));        initMocks(this);        activityController.setup();             }

}

我已经尝试过以下建议的解决方案,但是现在出现此错误:

我已经按照您的建议修改了我的代码,并抛出以下错误.在执行此行时ActivityController activityController = Robolectric.buildActivity(TestMyActivity.class);

java.lang.RuntimeException:java.lang.NoSuchMethodException:Tests $TestMyActivity.()

at org.robolectric.util.ReflectionHelpers.callConstructor(ReflectionHelpers.java:233)    at org.robolectric.util.ActivityController.of(ActivityController.java:27)    at org.robolectric.Robolectric.buildActivity(Robolectric.java:42)    at  Tests$TestMyActivity.setUp(RegistrationTest.java:89)    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498)    at org.junit.runners.model.FrameworkMethod.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)

解决方法:

首先,StorageManager不是字段或构造函数传递的字段,因此@InjectMocks没有任何作用.

我将重构Activity以使用更好的DI,但一个简单的胜利将是:

public class MyActivity extends ... {   @VisibleForTest   @RestrictTo(Scope.TESTS)   protected StorageManager GetStorageManager() {      ...   }}@RunWith(RobolectricTestRunner.class)@Config(constants = BuildConfig.class)public class MyActivityTest {    @Mock    private StorageManager storageManagerMock;    MyActivity myActivity;    @Before    public voID setUp() {        initMocks(this);        ActivityController<TestMyActivity> activityController = Robolectric.buildActivity(TestMyActivity.class);        myActivity = activityController.get();       // when(registrationActivity.GetMetricManager()).thenReturn(mock(MetricsManager));        activityController.setup();             }...   public class TestMyActivity extends MyActivity {      protected StorageManager GetStorageManager() {          return storageManagerMock;      }   }}

这应该进行较小的修改.

总结

以上是内存溢出为你收集整理的android-robolectric-如何在创建Activity对象时模拟和注入业务类全部内容,希望文章能够帮你解决android-robolectric-如何在创建Activity对象时模拟和注入业务类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1120958.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存