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

如何用OpenRewrite的RewriteTest测试内容不发生变更?

解决OpenRewrite控制测试(无变更验证)失败的问题

问题原因

你遇到的断言错误是因为在测试中同时传入了相同的before和after代码块,OpenRewrite测试框架会默认认为这个用例期望Recipe对代码做出修改,但实际执行后没有任何变更,因此触发AssertionError。

正确实现无变更验证的两种方式

方式1:仅提供输入代码(推荐)

在rewriteRun中,只给java()方法传入待测试的原始代码,框架会自动验证执行Recipe后代码与原始输入完全一致:

@Test
void controlTest() {
    rewriteRun(
        java(
            """
            package com.old.package;
            public class TestClass {}
            """
        )
    );
}

方式2:显式断言无变更

通过直接调用Recipe的run方法,断言返回的变更列表为空,明确验证没有产生任何修改:

@Test
void controlTest() {
    // 解析原始代码为JavaFile对象
    JavaFile inputCode = parse("""
            package com.old.package;
            public class TestClass {}
            """);
    
    // 执行Recipe并获取变更列表
    List<Change> changes = new ChangeFilterExpressionProperties().run(List.of(inputCode));
    
    // 断言变更列表为空
    assertThat(changes).isEmpty();
}

为什么原来的写法会失败

当你在java(before, after)中传入相同的代码时,测试框架会判定这个用例的预期是Recipe需要将before代码转换为after代码,但因为两者完全一致,Recipe没有执行任何修改动作,框架就会认为测试不通过,抛出"Recipe was expected to make a change but made no changes"的错误。

内容的提问来源于stack exchange,提问作者JGleason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 10:12:41