我正在尝试使用Robolectric测试片段。该片段包含代码:
public class MyDialogFragment extends DialogFragment {
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
// Verify that the host activity implements the callback interface
try {
// Instantiate the MyDialogListener so we can send events to the host
this.setListener((MyDialogListener) getActivity());
} catch (ClassCastException e) {
throw new ClassCastException(getActivity().toString()
+ " must implement MyDialogListener");
}
}
}
这种片段模式确保其所有者实现他们的听众在Android中非常常见。我正在我的@Test中创建我的片段和活动,如下所示:
fragment = MyDialogFragment.newInstance(/* Some params */);
FragmentActivity activity = Robolectric
.buildActivity(FragmentActivity.class)
.create().start()
.resume().get();
shadowActivity = shadowOf(activity);
FragmentManager fragmentManager = activity.getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager
.beginTransaction();
fragment.show(fragmentManager, "MyDialogFragment");
fragmentTransaction.commit();
当然,这会抛出CastClassException,因为FragmentActivity不实现MyDialogFragmentListener。
如何使用Robolectric进行测试?
到目前为止,我已经尝试让ActivityManager检查我们是否在测试中运行,如下所示:
if (!ActivityManager.isRunningInTestHarness()) {
throw new ClassCastException(getActivity().toString()
+ " must implement MyDialogFragmentListener");
}
但这似乎与我的测试设置无关。
我还考虑过使用空方法创建一个扩展FragmentActivity并实现MyDialogFragmentListener的MyDialogFragmentTestActivity类。这可能会奏效,但对我来说并不干净。我宁愿不创建仅用于测试的类。
有没有更好的方法来测试这个片段,使用JUnit,Robolectric和Mockito?