maven中的junit测试


maven倡导约定优于配置,而maven的约定目录结构为:

   src/main/java 下存放java类

   src/main/webapp 下存放页面文件(需要手动创建)

   src/main/resources 下存放资源文件

   src/test/java 下存放单元测试代码

   src/test/resources 下存放测试资源文件 


maven运行的生命周期为:

   复制src/main/resources资源文件到输出目录

   编译src/main/java下的源代码

   复制src/test/resources下的测试用资源文件到测试输出目录

   编译src/test/java下的测试用例

   运行测试用例

   打包生成


默认情况下,maven集成了maven-surefire-plugin插件,该插件会去查找src/test/java下所有包含Test的类作为测试类,测试类会去src/test/resources下查找测试资源。我们只需在测试方法上使用@Test注解,那么测试就顺理成章了。但是spring junit测试时,经常出现注解未扫描到注解的情况,例如:

package com.student.system.service.user;

import javax.annotation.Resource;
import org.junit.Test;
import com.student.system.entity.user.TUser;


public class TestUserService {
	
	@Resource
	private UserService userService;
	
	@Test
	public void findUserById(){
		TUser user =userService.findUserById("123");
		System.out.println(user.toString());
	}

}

会出现空指针异常,具体原因我也未找到,如果有人知道请留言告诉我。我将测试资源是放在了src/test/resources下的。

我们可以使用spring-junit包来提供对配置文件的支持来弥补上面的缺陷,这样就不需要在src/test/resources下再存放资源文件了。使用这种方法需要如下步骤:

1.使用@RunWith注解来实现SpringJUnit4ClassRunner.class来替换junit默认的执行类Suite

   @RunWith(SpringJUnit4ClassRunner.class)

2.指定Spring配置文件的位置

   @ContextConfiguration(locations={“classpath:applicationContext.xml”,“classpath:applicationContext-security.xml”,”file:src/main/webapp/WEB-INF/servlet.xml”})

   这里提供了2中路径的写法,一种是classpath,这种方式是去src/main/resources下查找资源文件。另一种file:是从项目根目录下查找指定的路径文件。

例如:

package com.student.system.service.user;

import javax.annotation.Resource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.student.system.entity.user.TUser;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class TestUserService {
	
	@Resource
	private UserService userService;
	
	@Test
	public void findUserById(){
		TUser user =userService.findUserById("123");
		System.out.println(user.toString());
	}

}