You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 12:54:03