两年没怎么写程序,因为紧急任务被拉去写程序。发现单元测试的一些变化。
junit4被5代替了
spring boot的start.io下载默认工程里,将junit-vintage-engine去掉。原因:spring-boot-starter-test有两个依赖,vintage(junit4)和jupiter (junit5).spring推荐用junit5,所以把vintage去掉留下了jupiter。 和junit4比,5的用法有一些不同,比如@Ignore被@Disabled代替,具体见
junit5官方手册
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
IDEA不停解析junit依赖
一个最简单的junit单元测试,compile没问题,但是不能run。执行时,idea会一直resolve maven dependency。具体哪些依赖,基本上就是jupiter所有的(我也没仔细盯着看)依赖。看起来解析好了,再run又开始resolve maven dependency…而且还是刚才resolve过的那些,在pom.xml加上:
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<scope>test</scope>
</dependency>
至于原因,一头雾水
MAVEN的test resources文件加载不到
由于是maven工程,单元测试在src/test/java/com…下,它用到的文件在src/test/resources/file.xml
Files.read(“file.xml”, StandardCharsets.UTF_8)
抛异常NPE (按理说找不到文件应该是IOE,汗)。
java doc说由Class Loader按照路径顺序查找文件。Class Loader路径在哪谁记得住啊,打印:
this.getClass().getClassLoader().getResource(".").getPath()
结果:
D:/workspace_git/projectA/projectA-submodule/target/test-classes/
因为用的IDEA,左侧就能看到target,发现没有这个file.xml文件,只有.class文件。
在pom.xml添加:
<build>
<testResources>
<testResource>
<directory>${project.basedir}/src/test/resources</directory>
</testResource>
</testResources>
</build>
resources下的所有一级目录及文件,包括file.xml,被放到了test-classes的根目录下了。这时执行:
this.getClass().getClassLoader().getResource(“file.xml”)
得到这个文件(InputStream)。如果找文件不存在,返回的Resource是null。
另外,this.getClass().getResource(".")会打印当前class的路径。即使这样Files.read(…)也还是NPE
结论:现在运行个junit都这么难了吗