是否可以混合使用jqwik与Mockito测试?运行时Mockito测试被忽略
jqwik 与 Mockito 混合使用说明及原有测试被忽略的解决方法
jqwik 原生支持和 Mockito 测试在同一项目、同一测试类下混合使用,原有 Mockito 测试运行时被忽略,全部是测试引擎、构建插件配置错误导致的,不存在框架层面的兼容性问题。
常见触发原因和对应解决方法如下:
- 缺少JUnit Vintage引擎依赖
如果你的原有Mockito测试是基于JUnit 4编写(用了@Test注解来自org.junit包、@RunWith(MockitoJUnitRunner.class)配置),引入jqwik后测试运行时默认只会加载JUnit Platform下的jqwik引擎,没有Vintage引擎桥接的话,所有JUnit 4的测试都会被标记为忽略,不会执行。
解决方法:在测试依赖中引入对应版本的junit-vintage-engine,scope设置为test即可,版本号和当前项目引入的JUnit Jupiter版本保持一致。 - 测试类注解冲突
不要在混合测试类上同时使用JUnit 4的@RunWith注解和jqwik的@Property注解,JUnit 4的Runner机制和JUnit Platform的扩展机制不兼容,会导致测试识别异常。
推荐统一用JUnit 5 + Mockito Extension的写法,原有Mockito测试和新增jqwik测试可以无冲突共存,参考写法:
import net.jqwik.api.ForAll; import net.jqwik.api.Property; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MixedTestCase { @Mock private UserRepository userRepository; // 原有Mockito测试,保持原有写法不变 @Test void shouldQueryUserSuccess() { when(userRepository.getById(1L)).thenReturn(new User(1L, "test")); UserService userService = new UserService(userRepository); assertThat(userService.getUser(1L).getUsername()).isEqualTo("test"); } // 新增jqwik属性测试,可直接复用类上配置的Mock对象 @Property void shouldCheckUsernameValid(@ForAll String randomUsername) { UserService userService = new UserService(userRepository); assertThat(userService.checkUsernameFormat(randomUsername)).isNotNull(); } }
- 构建插件版本过低
如果用Maven执行全量测试,maven-surefire-plugin版本低于2.22.2时存在多测试引擎识别bug,只会加载类路径下找到的第一个测试引擎,其余引擎对应的测试会全部被跳过。
解决方法:将surefire插件版本升级到2.22.2及以上,不要在插件配置中手动指定单一测试引擎,也不要添加不合理的测试文件包含/排除规则,过滤掉非jqwik的测试文件。
额外说明:jqwik本身提供了对Mockito的原生支持,不需要引入额外的桥接包,只要Mockito扩展正常注册,@Mock注入的对象可以直接在@Property修饰的属性测试方法中正常使用,生命周期和普通JUnit 5测试完全一致。
内容的提问来源于stack exchange,提问作者user18301290
相关产品推荐
相关产品推荐

