我正在尝试测试一个 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/