我和spring boot maven 工程里运行junit单元测试的故事

两年没怎么写程序,因为紧急任务被拉去写程序。发现单元测试的一些变化。

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官方手册

       
			org.springframework.boot
			spring-boot-starter-test
			test
			
				
					org.junit.vintage
					junit-vintage-engine
				
			
		

IDEA不停解析junit依赖

一个最简单的junit单元测试,compile没问题,但是不能run。执行时,idea会一直resolve maven dependency。具体哪些依赖,基本上就是jupiter所有的(我也没仔细盯着看)依赖。看起来解析好了,再run又开始resolve maven dependency…而且还是刚才resolve过的那些,在pom.xml加上:

       
			org.junit.platform
			junit-platform-launcher
			test
		

至于原因,一头雾水

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添加:

	
		
			
				${project.basedir}/src/test/resources
			
		
	

resources下的所有一级目录及文件,包括file.xml,被放到了test-classes的根目录下了。这时执行:
this.getClass().getClassLoader().getResource(“file.xml”)
得到这个文件(InputStream)。如果找文件不存在,返回的Resource是null。
另外,this.getClass().getResource(".")会打印当前class的路径。即使这样Files.read(…)也还是NPE

结论:现在运行个junit都这么难了吗

你可能感兴趣的:(spring-boot)