代码之家  ›  专栏  ›  技术社区  ›  Ivan

单元测试Android片段时的ClassCastException onAttach()

  •  1
  • Ivan  · 技术社区  · 7 年前

    我试图测试一个接口中的片段,该片段必须由宿主活动实现,并通过 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:)

    我知道问题在于我的Unit Test ActivityForUnitTesting对象没有实现所需的接口方法。我的问题是, 如何在单元测试中安全地实现这些方法

    1 回复  |  直到 7 年前
        1
  •  0
  •   Ivan    7 年前

    我没有找到解决办法,但我找到了一个“解决办法”。而不是使用 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;
        }
    
        ...
    
    }
    

    然后,您应该已经在主机活动中实现了ExampleFragmentListener。Just call

    setExampleFragmentListener(ActivityOrClassThatImplementsExampleFragmentListener)

    推荐文章