Kotlin创建类空参次构造器报委托调用链循环错误如何解决
问题根因
你编写的无参次构造器constructor() : this()属于自身调用自身,形成了无限循环的委托链,违反Kotlin构造器的基础规则:所有次构造器必须最终直接或间接委托到主构造器。你的主构造器要求传入FragmentManager参数,当前的无参构造器没有满足这个要求,所以触发了循环委托的报错。
解决方法
你要测试的addFragment方法本身不依赖FragmentManager的功能,只要保证构造器能正常初始化即可,有两种常用方案:
方案1:修改业务代码适配测试(无需改动测试用例)
给主构造器的FragmentManager参数添加默认值,或者单独新增合法的无参次构造器,示例如下:
class Adapter(sFM: FragmentManager) : FragmentPagerAdapter(sFM, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) { // 新增合法的无参次构造器,委托主构造器传入空实现的FragmentManager constructor() : this(object : FragmentManager() {}) private val pFragmentList = ArrayList<Fragment>() private val pFragmentTitle = ArrayList<String>() override fun getCount(): Int = pFragmentList.size override fun getItem(position: Int): Fragment = pFragmentList[position] override fun getPageTitle(position: Int): CharSequence = pFragmentTitle[position] fun addFragment(fm: Fragment, title: String) { pFragmentList.add(fm) pFragmentTitle.add(title) } }
修改后你就可以直接用Adapter()实例化类,注意原测试用例的addFragment方法需要传入两个参数,调用时要补全参数。
方案2:不修改业务代码,测试时传入模拟参数
如果不想改动原有业务代码,直接在测试中用Mock框架生成FragmentManager实例传入即可,示例如下:
@Test fun `create instance of class Adapter`() { // 用Mockito模拟FragmentManager和Fragment实例,也可以用其他Mock框架 val mockFM = org.mockito.Mockito.mock(FragmentManager::class.java) val mockFragment = org.mockito.Mockito.mock(Fragment::class.java) var adapter = Adapter(mockFM) adapter.addFragment(mockFragment, "测试标题") // 后续补充你的测试断言 }
内容的提问来源于stack exchange,提问作者Szymon
相关产品推荐
相关产品推荐

