Java 如何为使用AndroidSchedulers.mainThread()的函数编写测试;来自RxAndroid
我在测试方法Java 如何为使用AndroidSchedulers.mainThread()的函数编写测试;来自RxAndroid,java,android,rx-java,rx-android,Java,Android,Rx Java,Rx Android,我在测试方法shouldFetchMachineSettings()中得到一个NullPointerException。通过调试,我意识到控件没有进入可观察对象的成功回调,并且意图没有启动。因此有例外。我意识到问题在于使用AndroidSchedulers.mainThread()但无法找到解决方案 MachineSettings.java public class MachineSettings { public static void fetch(final FragmentAct
shouldFetchMachineSettings()
中得到一个NullPointerException
。通过调试,我意识到控件没有进入可观察对象的成功回调,并且意图没有启动。因此有例外。我意识到问题在于使用AndroidSchedulers.mainThread()代码>但无法找到解决方案
MachineSettings.java
public class MachineSettings {
public static void fetch(final FragmentActivity activity,
MachineService machineService,
final ProgressDialog progressDialog) {
Observable zippedCalls = Observable.zip(
machineService.getSettings(),
machineService.getInfoAsObservable(),
machineService.getSupportedLanguages(),
new Func3() {
@Override
public Object call(final Object response1,
final Object response2,
final Object response3) {
return new HashMap<String, Object>() {{
put(MACHINE_SETTINGS, response1);
put(MACHINE_SETTINGS_INFO, response2);
put(MACHINE_SETTINGS_LANGUAGES, response3);
}};
}
});
zippedCalls.subscribeOn(getNewThread())
.observeOn(getAndroidSchedulerMainThread())
.subscribe(onSuccess(activity, progressDialog)
, onError(activity, progressDialog));
}
public static Scheduler getAndroidSchedulerMainThread() {
return AndroidSchedulers.mainThread();
}
public static Scheduler getNewThread() {
return Schedulers.newThread();
}
private static Action1 onSuccess(final FragmentActivity activity,
final ProgressDialog progressDialog) {
return new Action1() {
@Override
public void call(Object o) {
Intent intent = new Intent(activity, MachineSettingsActivity_.class);
// do some action using object o
activity.startActivity(intent);
}
};
}
private static Action1<Throwable> onError(final FragmentActivity activity,
final ProgressDialog progressDialog) {
return new Action1<Throwable>() {
@Override
public void call(Throwable error) {
// do some action
}
};
}
}
在MachinedDetailsFragmentTest.java中进行测试
@Test
public void shouldFetchMachineSettings() {
MenuItem mockMenuItem = mock(MenuItem.class);
when(mockMenuItem.getItemId()).thenReturn(R.id.action_machine_settings);
Map<String, Integer> settings = new HashMap() {{put("privacy", 0);}};
Map<String, Integer> languages = new HashMap() {{put("index_0", 2);}} ;
Map<String, String> info = new HashMap() {{put("version", "1");}};
Observable<Map<String, Integer>> mockSupportedLanguages = Observable.just(languages);
Observable<Map<String, Integer>> mockSettings = Observable.just(settings);
Observable<Map<String, String>> mockInfo = Observable.just(info);
when(machineService.getSupportedLanguages()).thenReturn(mockSupportedLanguages);
when(machineService.getSettings()).thenReturn(mockSettings);
when(machineService.getInfoAsObservable()).thenReturn(mockInfo);
machineDetailFragment.onOptionsItemSelected(mockMenuItem);
Intent intent = Shadows.shadowOf(activity).peekNextStartedActivity();
assertThat(intent.getComponent().getClassName(),
is(MachineSettingsActivity_.class.getCanonicalName()));
@测试
public void应获取机器设置(){
MenuItem mockMenuItem=mock(MenuItem.class);
当(mockMenuItem.getItemId())。然后返回(R.id.action\u machine\u设置);
Map settings=newhashmap(){{put(“privacy”,0);};
Map languages=newhashmap(){{put(“index_0”,2);};
Map info=newhashmap(){{put(“version”,“1”);};
Observable mockSupportedLanguages=Observable.just(语言);
Observable mockSettings=Observable.just(设置);
Observable mockInfo=Observable.just(信息);
当(machineService.getSupportedLanguages())。然后返回(mockSupportedLanguages);
当(machineService.getSettings())。然后返回(mockSettings);
当(machineService.getInfoAsObservable())。然后返回(mockInfo);
MachinedDetailFragment.onOptionsItemSelected(mockMenuItem);
Intent Intent=Shadows.shadowOf(activity).peekNextStartedActivity();
assertThat(intent.getComponent().getClassName(),
是(MachineSettingsActivity_uuu.class.getCanonicalName());
修改类,使其不使用静态
方法,并创建一个接受两个要使用的调度程序
的构造函数。在测试中,您可以使用不同的调度程序,如TestScheduler
或调度程序.immediate()
一般的经验法则是:调用其他静态方法(或使用全局状态、单例)的静态方法很难测试。您研究过吗?@Maha您找到解决方法了吗?
@Test
public void shouldFetchMachineSettings() {
MenuItem mockMenuItem = mock(MenuItem.class);
when(mockMenuItem.getItemId()).thenReturn(R.id.action_machine_settings);
Map<String, Integer> settings = new HashMap() {{put("privacy", 0);}};
Map<String, Integer> languages = new HashMap() {{put("index_0", 2);}} ;
Map<String, String> info = new HashMap() {{put("version", "1");}};
Observable<Map<String, Integer>> mockSupportedLanguages = Observable.just(languages);
Observable<Map<String, Integer>> mockSettings = Observable.just(settings);
Observable<Map<String, String>> mockInfo = Observable.just(info);
when(machineService.getSupportedLanguages()).thenReturn(mockSupportedLanguages);
when(machineService.getSettings()).thenReturn(mockSettings);
when(machineService.getInfoAsObservable()).thenReturn(mockInfo);
machineDetailFragment.onOptionsItemSelected(mockMenuItem);
Intent intent = Shadows.shadowOf(activity).peekNextStartedActivity();
assertThat(intent.getComponent().getClassName(),
is(MachineSettingsActivity_.class.getCanonicalName()));