OpenRewrite迁移JUnit静态导入的assertThrows至AssertJ失败问题排查
解决JUnit静态导入的assertThrows/assertDoesNotThrow未迁移到AssertJ的问题
可能的原因与解决方案
1. 升级Rewrite测试框架配方版本
你当前使用的rewrite-testing-frameworks:2.6.0版本对assertThrows这类静态导入断言的迁移支持存在不足。建议升级到较新的稳定版本(如2.10.0及以上),新版本通常会修复这类覆盖不全的问题。
修改Gradle依赖:
implementation("org.openrewrite.recipe:rewrite-testing-frameworks:2.10.0")
2. 显式启用完整的AssertJ迁移配方集
确保Rewrite配置中,除了JUnitToAssertj,还显式添加异常断言相关的子配方,同时启用JUnitStaticImportsToAssertj覆盖静态导入的转换:
rewrite { activeRecipe("org.openrewrite.java.testing.assertj.JUnitToAssertj") activeRecipe("org.openrewrite.java.testing.assertj.JUnitAssertThrowsToAssertExceptionType") activeRecipe("org.openrewrite.java.testing.assertj.JUnitStaticImportsToAssertj") }
3. 手动迁移未转换的代码(临时方案)
如果自动迁移仍不生效,可手动将JUnit的异常断言转换为AssertJ的写法:
示例1迁移后代码
import static org.assertj.core.api.Assertions.assertThatThrownBy; @Test @DisplayName("resolve contract state - no interest matches ref") void testResolveContractStateNoInterest() throws ApplicationException { // given Contract contractMock = createContractMock(false, false); mockContractApi(contractMock); InsuranceSuspensionView suspensionMock = createSuspensionMock(false); mockAmendmentApi(suspensionMock); // when ContractRequiredServiceImpl classUnderTest = spy(new ContractRequiredServiceImpl(sc)); // then ContractException exception = assertThatThrownBy(() -> classUnderTest.resolveContractState(GIVEN_CONTRACT_REF, UNKNOWN_INTEREST_REF, GIVEN_BUSINESS_DATE)) .isInstanceOf(ContractException.class) .extracting(ex -> ex.getError().getMessageId()) .isEqualTo("My Custom Error Message"); }
示例2迁移后代码
import static org.assertj.core.api.Assertions.assertThatThrownBy; @Test void mapKorrekturgrundReasonThrows() { // when + then assertThatThrownBy(() -> IccTypeMapper.INSTANCE.mapKorrekturgrundReason(null)) .isInstanceOf(IllegalArgumentException.class); }
对于assertDoesNotThrow,对应的AssertJ写法是:
import static org.assertj.core.api.Assertions.assertThatCode; assertThatCode(() -> yourMethodCall()).doesNotThrowAnyException();
4. 检查版本兼容性
确保AssertJ Gradle插件(6.11.2)与Rewrite测试框架配方版本匹配,避免因版本不兼容导致功能失效。
内容的提问来源于stack exchange,提问作者cyberpunk
相关产品推荐
相关产品推荐

