如何用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
相关产品推荐
相关产品推荐

