解决@Test注解不生效问题
这个问题是我在编译spring源码,并运行自己写的单测的时候所遇到的
并不清楚在一般的项目中是否会复现这个问题,以及复现之后根据这个方法能否解决,请各位自行斟酌
另外,很喜欢《哈姆雷特》中的一句话:有一千个编译spring源码的人,就有一千种错误😑
我身边编译spring源码的朋友,都遇到了大大小小的问题,要命的是,这些问题都各不相同🤨
正文
所用的spring源码版本是 5.3.5-SNAPSHOT
克隆、编译 spring 源码
不是重点,可跳过
从 GitHub 上拉取 spring 源码下来,然后进行编译
如果用 gradlew build
命令进行整个 spring 项目的编译的过程中会遇到一些模块的单测跑不通,建议可以先单独编译这个模块,然后再去编译整个 spring 项目
即使是这样,我也还是遇到 spring-core 中始终有些单测跑不通的情况,应该不是很影响
写单测
问题的出现和描述,看一下
然后,就可以开始写自己的单测来检验 spring 项目是否真正地准备就绪
上图中的 spring-spice-practice 是我自己新增的模块,用于自己的一些测试
单测代码如下:
/**
* @author spice
* @date 2021/03/18 22:09
*/
public class UserServiceTest {
@Test
public void test() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
UserService userService = context.getBean("userServiceImpl", UserService.class);
userService.printUser();
}
}
运行上面的单测后,控制台输出这样的错误提示:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':spring-spice-practice:test'.
> There were failing tests. See the report at: file:///P:/Project%20of%20Github/spring-framework/spring-spice-practice/build/reports/tests/test/index.html
然后,打开 report(spring-spice-practice/build/reports/tests/test/index.html
),发现主要的错误是这样的:
org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not complete execution for Gradle Test Executor 2.
Caused by: org.junit.platform.commons.JUnitException: TestEngine with ID 'junit-jupiter' failed to discover tests
Caused by: org.junit.platform.commons.JUnitException: ClassSelector [className = 'com.spice.service.UserServiceTest'] resolution failed
Caused by: java.lang.NoClassDefFoundError: org/junit/jupiter/api/DisplayNameGenerator$Simple
Caused by: java.lang.ClassNotFoundException: org.junit.jupiter.api.DisplayNameGenerator$Simple
解决问题
然后我就去翻博客,发现并没有能解决我的问题
既然是 junit 的问题,而且我又用的是 junit5,我猜测可能是 junit 的依赖和引擎版本不匹配的问题
在我创建 spring-spice-practice 模块的时候,IDEA 默认帮我创建的该模块的 gradle 文件是这样子的:
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.5-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
}
test {
useJUnitPlatform()
}
可以看到 junit-jupiter-api
的版本是 5.6.1 的,但是 junit-jupiter-engine
没有指定版本
我指定了 junit-jupiter-engine
的版本,并且也是 5.6.1 之后,问题就解决了,gradle 文件如下:
plugins {
id 'java'
}
group 'org.springframework'
version '5.3.5-SNAPSHOT'
repositories {
mavenCentral()
}
dependencies {
compile(project(":spring-core")) // 必要的模块
compile(project(":spring-context")) // 必要的模块
compile(project(":spring-beans")) // 必要的模块
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.6.1'
}
test {
useJUnitPlatform()
}
然后,我又把 api 的版本和 engine 的版本都换成 5.6.0 的,也是 ok 的🙂
所以,猜测之前的问题是由于 api 的版本和 engine 的版本不一致所导致的