android - 单元测试 Android Fragment 时 ClassCastException onAttach()

标签 android unit-testing android-fragments listener classcastexception

我正在尝试测试一个 fragment ,该 fragment 具有必须由托管 Activity 实现的接口(interface),并通过 onAttach() 强制转换为该特定接口(interface)的类型。

问题:我不确定如何在 Android 单元测试中实现必要的接口(interface)方法,或者是否有必要这样做。令人惊讶的是,我没有找到任何解决此问题的帖子或论坛。

测试:

public class FragmentTest {

    private ActivityForUnitTesting fragmentHostActivity;
    private ExampleFragment fragmentToTest;

    @Rule
    public ActivityTestRule activityTestRule = new ActivityTestRule<>(ActivityForUnitTesting.class);

    @Before
    public void setUp() {
        fragmentHostActivity = (ActivityForUnitTesting) activityTestRule.getActivity();
        fragmentManager = fragmentHostActivity.getSupportFragmentManager();
        fragmentToTest = new ExampleFragment();
    }

    @Test
    public void testExample() {
        fragmentManager.beginTransaction()
                .replace(R.id.frame_layout_container, fragmentToTest)
                .commit();
    }

}

fragment :

public class ExampleFragment extends Fragment {

    private ExampleFragmentListener exampleFragmentListener;

    ...

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        try {
            exampleFragmentListener = (ExampleFragmentListener) context;
        } catch (ClassCastException e) {
            throw new ClassCastException(context.toString() + " must implement ExampleFragmentListener");
        }
    }

    ...

}

但是当我尝试运行一个简单的测试时,我得到:

java.lang.ClassCastException: com.example.package.ActivityForUnitTesting@1234567 must implement ExampleFragmentListener at com.example.package.ExampleFragment.onAttach(ExampleFragment.java:)

我知道问题是我的单元测试 ActivityForUnitTesting 对象没有实现所需的接口(interface)方法。我的问题是,如何在单元测试中安全地实现这些方法。我没有运气找到类似的问题或可靠的例子。

最佳答案

我没有找到解决方案,但我确实找到了“解决方法”。通过公共(public)方法显式设置监听器,而不是使用 onAttach()

public class ExampleFragment extends Fragment {

    private ExampleFragmentListener exampleFragmentListener;

    ...

    //@Override
    //public void onAttach(Context context) {
    //    super.onAttach(context);
    //    try {
    //        exampleFragmentListener = (ExampleFragmentListener) context;
    //    } catch (ClassCastException e) {
    //        throw new ClassCastException(context.toString() + " must implement ExampleFragmentListener");
    //    }
    //}

    public void setExampleFragmentListener(ExampleFragmentListener exampleFragmentListener) {
        this.exampleFragmentListener = exampleFragmentListener;
    }

    ...

}

然后,您应该已经在宿主 Activity 中实现了 ExampleFragmentListener。只需调用电话

setExampleFragmentListener(ActivityOrClassThatImplementsExampleFragmentListener)

无论您在何处执行 Activity 设置。因此,测试不应提示未实现的方法。

关于android - 单元测试 Android Fragment 时 ClassCastException onAttach(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51976223/

相关文章:

unit-testing - ABAP 单元测试类 - 很好的引用

android - 自定义操作栏菜单项一键不响应

android studio 上的 java.lang.NoClassDefFoundError

c# - 依赖注入(inject),DDD 什么要单元测试(&mock)?

android - 使用 MockK 测试 LiveData 和协程

javascript - 使用 .env 文件对 jest 进行单元测试

Android 嵌套 fragment - fragment 交互

java - android studio 重复点击底部导航栏时如何使fragment不闪烁或不重新加载

android - 在android中获取对HTTP查询的JSON响应

java - 从 baseActivity android 调用一个函数