Android - Robolectric testing With RxAndroid?



我正在尝试使用robolectric测试我的Android应用程序,但遇到了我无法遇到的测试问题。

我正在测试一项扩展我的碱性类别并使用rxandroid的活动,该类看起来像这样:

public abstract class BaseActivity extends AppCompatActivity {
    protected final SharedService sharedService = MyApplication.getInstance().getSharedService();
    protected Activity getActivity() {
        return this;
    }
}

您可以看到它从我的应用程序库类中获得了共享服务对象。

在我的活动中,我然后以下参考此代码:

//...
        Subscription s = sharedService.login(params)
            .compose(ObservableUtils.<JsonObject>applySchedulers())
            .subscribe(new Action1<JsonObject>() {
                @Override
                public void call(JsonObject jsonObject) {
                    //...
                }
            }, new Action1<Throwable>() {
                @Override
                public void call(Throwable throwable) {
                    //...
                }
            });
    subscriptions.add(s);
//..

因此,该活动直接引用了从基础激发访问它的共享服务变量,并在共享服务对象上调用方法。它使用rxandroid获得可观察的。

改装呼叫中的代码如下:

@POST("/login")
Observable<JsonObject> login(
        @Body JsonObject body) ;

问题是当我使用robolectric进行测试时,我会在调用Rxandroid代码的活动中得到一个null指针异常。

我的测试如下:

@Config(constants = BuildConfig.class)
@RunWith(TestRunner.class)
public class MyActivityTest{
@Mock
private SharedService mockSharedService;
@Before
    public void setup() {
        // Convenience method to run Activity through the Activity Lifecycle methods:
        // onCreate(...) => onStart() => onPostCreate(...) => onResume()
        MockitoAnnotations.initMocks(this);
        TestMyApplication testMyApp = (TestMyApplication) TestCompanionApplication.getInstance();
        testMyApp.setSharedService(this.mockSharedService); //Set our Mocked application class to use our mocked API
        //Build our activity using Robolectric
        ActivityController<MyActivity> controller = Robolectric.buildActivity(MyActivity.class);
        activity = controller.get();
        controller.create(); //Create out Activity
        //..Get views
}
@Test
public void testService(){
    btnTest.click(); //This fires the service call
    Mockito.verify(this.mockSharedService).login((JsonObject) Mockito.any());
}

当我运行此测试时,我将获得NullPoInterException。

所以我知道我需要以某种方式获得活动来使用我在testmyapplication类上设置的模拟API,但是由于baseeactivity创建了一个容纳此的变量,然后我的其他活动会引用我该如何做到这一点。使用robolectric?

修复非常容易:

when(mockSharedService.login(any())).thenReturn(Observable.just(new JsonObject()));

,但稍后您可能会尝试处理收到的json

相关内容

  • 没有找到相关文章

最新更新