【问题标题】:ClassCastException onAttach() when unit testing Android Fragment单元测试 Android 片段时的 ClassCastException onAttach()
【发布时间】:2019-01-29 06:25:45
【问题描述】:

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

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

测试

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();
    }

}

片段

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 必须实现 ExampleFragmentListener 在 com.example.package.ExampleFragment.onAttach(ExampleFragment.java:)

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

【问题讨论】:

标签: android unit-testing android-fragments listener classcastexception


【解决方案1】:

我没有找到解决方案,但我确实找到了“解决方法”。不要使用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 设置的任何位置。因此,测试不应该抱怨未实现的方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-28
    • 2015-12-12
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多