如何在不支持@Rule的JUnit 6中实现Sniffy的JUnit测试
如何在不支持@Rule的JUnit 6中实现Sniffy的JUnit测试
嗨,我来帮你搞定这个问题~
你遇到的核心问题是:JUnit 5(包括你提到的JUnit 6,其实官方目前的最新版本仍属于JUnit 5 Jupiter生态)已经废弃了JUnit 4时代的@Rule注解,转而采用**扩展模型(Extension Model)**来实现类似的功能。好在Sniffy完全支持JUnit 5的扩展机制,不需要再依赖@Rule啦。
下面是具体的修改步骤和调整后的代码:
1. 替换@Rule为JUnit 5的扩展注册方式
JUnit 5提供了两种替代@Rule的方案,选其中一种就行:
- 方案一:用
@RegisterExtension注解注册Sniffy扩展实例(和原来的@Rule用法最接近) - 方案二:在测试类上添加
@ExtendWith(SniffyExtension.class)注解(更简洁,适合不需要自定义扩展实例的场景)
2. 调整后的完整测试代码
这里用@RegisterExtension的方案来修改你的代码,保持和原写法的连贯性:
package edu.group5.app.control; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import io.sniffy.socket.DisableSockets; import io.sniffy.test.junit5.SniffyExtension; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertFalse; public class OrgAPIWrapperTest { String testURL; String wrongURL; @BeforeEach void init() { testURL = "https://app.innsamlingskontrollen.no/api/public/v1/all"; wrongURL = "This is not a URL"; } // 替换原来的@Rule,用JUnit 5的@RegisterExtension @RegisterExtension public static final SniffyExtension sniffyExtension = SniffyExtension.INSTANCE; @Test @DisableSockets public void noConnectionReturnsFalseImport() { // 这里写你要测试的无网络场景代码就好 // 比如调用你的OrgAPIWrapper方法,然后断言结果 // 示例逻辑: // OrgAPIWrapper wrapper = new OrgAPIWrapper(); // boolean result = wrapper.importFromURL(testURL); // assertFalse(result, "无网络时应该返回false"); } }
补充说明
- 注意引入的Sniffy扩展类是
io.sniffy.test.junit5.SniffyExtension,不是原来JUnit 4的SniffyRule哦~ @DisableSockets注解在JUnit 5下完全兼容,不需要修改,它会让Sniffy拦截测试中所有的Socket连接,完美模拟无网络环境。- 如果你不需要自定义Sniffy扩展的实例,也可以直接在测试类上加上
@ExtendWith(SniffyExtension.class),然后删掉@RegisterExtension那行代码,效果是一样的。
备注:内容来源于stack exchange,提问作者Lucy
相关产品推荐
相关产品推荐

