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

Kotlin单元测试中如何访问protected方法与属性?

Kotlin单元测试中访问protected方法的正确方式

当然可以在Kotlin单元测试中通过反射访问protected属性和方法,你当前的代码有两处明显错误,导致调用失败:

  • 方法获取错误:getDeclaredMethod("doPost")没有传入方法的参数类型。doPost方法需要接收HttpServletRequest和HttpServletResponse两个参数,必须在调用getDeclaredMethod时指定这两个参数的Class对象,否则JVM找不到对应的重载方法。
  • 反射调用错误:protectedMethod.invoke(jobServlet.doPost(mockHttpRequest, mockHttpResponse))的写法完全错误。invoke方法的第一个参数是要调用方法的实例对象,后续参数才是目标方法需要的入参;你现在的写法是先尝试直接调用doPost(它是protected,本身就无法直接调用),再把返回值传给invoke,逻辑完全颠倒。

修正后的测试代码如下:

@Test
fun doPostTest(){
    // 获取带参数列表的doPost方法
    val protectedMethod = myHttpServlet::class.java.getDeclaredMethod(
        "doPost",
        HttpServletRequest::class.java,
        HttpServletResponse::class.java
    )
    // 开启访问权限
    protectedMethod.isAccessible = true
    // 正确执行反射调用:实例 + 方法参数
    protectedMethod.invoke(jobServlet, mockHttpRequest, mockHttpResponse)
}

额外提醒:如果你的测试类和myHttpServlet不在同一个包下,必须设置isAccessible = true才能突破protected的访问限制;如果只是需要模拟doPost的行为,也可以用MockK的every { ... } answers { ... }来直接拦截方法调用,无需反射。

内容的提问来源于stack exchange,提问作者Xuai

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:40:08