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
相关产品推荐
相关产品推荐

