测试需要父活动实现侦听器的片段

时间:2016-03-02 01:48:31

标签: java android unit-testing mockito robolectric

我正在尝试使用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?

0 个答案:

没有答案