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

cla*_*o_n 5 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");
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

这种确保其所有者实现其侦听器的片段模式在 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();
Run Code Online (Sandbox Code Playgroud)

当然,这会引发 CastClassException,因为 FragmentActivity 没有实现 MyDialogFragmentListener。

如何使用 Robolectric 进行测试?

到目前为止,我已经尝试让 ActivityManager 检查我们是否在测试中运行,如下所示:

if (!ActivityManager.isRunningInTestHarness()) {
   throw new ClassCastException(getActivity().toString()
        + " must implement MyDialogFragmentListener");
}
Run Code Online (Sandbox Code Playgroud)

但这似乎不适用于我的测试设置。

我还考虑制作一个 MyDialogFragmentTestActivity 类,该类扩展 FragmentActivity 并实现 MyDialogFragmentListener,并使用空方法。这可能会起作用,但对我来说并不干净。我宁愿不创建仅用于测试的类。

有没有更好的方法来测试这个片段,使用 JUnit、Robolectric 和 Mockito?