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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 11:52:20