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

升级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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 04:32:14