升级JDK17后PowerMock兼容问题,求whenNew代码替代方案
替代PowerMock
whenNew 的Mockito/Mockk方案 Mockito 实现(Java/Kotlin)
如果用Mockito处理构造函数拦截并返回自定义实例,需正确使用mockConstruction的作用域和参数获取逻辑,注意原代码中getArguemnt的拼写错误(应为getArgument)。示例如下:
Java 代码
// 用try-with-resources控制mock作用域,确保测试后自动清理 try (MockedConstruction<A> mockedAConstruction = Mockito.mockConstruction(A.class, (mock, context) -> { // 获取构造函数传入的第一个参数 Object constructorFirstArg = context.arguments().get(0); // 返回自定义的ClassB实例(需保证ClassB是A的子类) return new ClassB(arg1, constructorFirstArg); })) { // 在此块内执行测试代码,所有new A(...)都会返回ClassB实例 yourTestMethod(); }
Kotlin 代码
Mockito.mockConstruction(A::class.java) { mock, context -> val constructorFirstArg = context.arguments[0] ClassB(arg1, constructorFirstArg) }.use { // 执行测试逻辑 yourTestMethod() }
Mockk 实现(Kotlin)
Mockk的构造函数拦截更简洁,需确保使用兼容JDK17的最新版本(如1.13.8+):
// 拦截A的构造函数 mockkConstructor(A::class) // 定义构造调用的返回逻辑 every { A(any()) } answers { ClassB(arg1, firstArg()) } // 执行测试代码 yourTestMethod() // 测试后清理mock unmockkConstructor(A::class)
关键注意事项
- 确保
ClassB是A的子类,否则类型不兼容无法替换返回实例 - Mockito的
mockConstruction必须在作用域内生效(try-with-resources或use块),避免影响其他测试 - Mockk需升级到支持JDK17的版本,旧版本可能存在兼容性问题
内容的提问来源于stack exchange,提问作者mmdreza baqalpour
相关产品推荐
相关产品推荐

