Spring MVC Junit测试实例 附:读取WEB-INF下配置文件的方法

来源:互联网 发布:学软件的网站 编辑:程序博客网 时间:2024/04/19 20:53
Spring+Unit测试实例:
之前写过一个连接数据库的spring mvc annotation的一个实例(点击这里查看)。
当我们启动Web项目时要先启动Tomcat,而在Tomcat的启动过程中会读取spring项目的的各个配置文件,实例化各个注入的类,所以我们的程序中直接使用注解就可以操作各个类。

但是如果按普通的项目测试,就缺少了读取配置文件的过程,所以当你调用一个类方法时会出现空指针错误,因为类没有实例化。

对Spring MVC Dao的JUnit的测试。

下面是对上面提到的实例中的UserDao.class的测试,内容如下:

[java] view plaincopyprint?
  1. package org.spring.wayne.dao;  
  2.   
  3. import org.junit.Test;  
  4. import org.junit.runner.RunWith;  
  5. import org.spring.wayne.web.form.User;  
  6. import org.springframework.beans.factory.annotation.Autowired;  
  7. import org.springframework.test.context.ContextConfiguration;  
  8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;  
  9.   
  10. @RunWith(SpringJUnit4ClassRunner.class)  
  11. @ContextConfiguration(locations = { "file:WebContent/WEB-INF/springMVCForm-servlet.xml" })  
  12. public class UserDaoTest {  
  13.   
  14.     @Autowired  
  15.     private UserDao userDao;  
  16.   
  17.     @Test  
  18.     public void test() {  
  19.         User user = new User();  
  20.         user.setUserName("u");  
  21.         user.setPassword("p");  
  22.         userDao.addUser(user);  
  23.     }  
  24.   
  25. }  
右键->Run as->JUnit Test运行,无误。查询数据库显示已经插入数据库。

对Spring MVC Controller的JUnit的测试。

下面是对上面提到的实例中的RegController.class的测试,内容如下:

[java] view plaincopyprint?
  1. package org.spring.wayne.web.controller;  
  2.   
  3. import static org.junit.Assert.assertEquals;  
  4.   
  5. import org.junit.After;  
  6. import org.junit.Before;  
  7. import org.junit.Test;  
  8. import org.mockito.Mock;  
  9. import org.mockito.Mockito;  
  10. import org.mockito.MockitoAnnotations;  
  11. import org.spring.wayne.web.form.User;  
  12. import org.springframework.mock.web.MockHttpServletRequest;  
  13. import org.springframework.mock.web.MockHttpServletResponse;  
  14. import org.springframework.ui.ExtendedModelMap;  
  15. import org.springframework.ui.Model;  
  16. import org.springframework.validation.BindingResult;  
  17.   
  18. public class RegControllerTest {  
  19.   
  20.     @Mock  
  21.     private BindingResult mockBindingResult;  
  22.       
  23.     @Before  
  24.     public void setUp() {  
  25.         MockitoAnnotations.initMocks(this);  
  26.         Mockito.when(mockBindingResult.hasErrors()).thenReturn(true);  
  27.     }  
  28.   
  29.     @Test  
  30.     public void test() throws Exception {  
  31.         MockHttpServletRequest request = new MockHttpServletRequest();  
  32.         MockHttpServletResponse response = new MockHttpServletResponse();  
  33.         RegController regController = new RegController();  
  34.         Model model = new ExtendedModelMap();  
  35.         User user = new User();  
  36.         user.setUserName("uuuuuuu");  
  37.         user.setPassword("ppppppp");  
  38.         String result = regController.handler(user, mockBindingResult, model, request, response);  
  39.         System.out.println(result);  
  40.         assertEquals("register", result);  
  41.     }  
  42.   
  43.     @After  
  44.     public void destroy() {  
  45.   
  46.     }  
  47. }  
右键->Run as->JUnit Test运行,无误





读取WEB-INF下配置文件的方法:

配置文件放在class目录下:

[java] view plaincopyprint?
  1. ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springMVCForm-servlet.xml");  

WEB-INF下:

[java] view plaincopyprint?
  1. ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WebContent/WEB-INF/springMVCForm-servlet.xml");  

多个文件可用*表示:

[java] view plaincopyprint?
  1. ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WebContent/WEB-INF/springMVCForm-*.xml");  
注解方式:

配置文件放在class目录下:

[java] view plaincopyprint?
  1. @ContextConfiguration(locations={"classpath:springMVCForm-servlet.xml"})  

WEB-INF下:

[java] view plaincopyprint?
  1. @ContextConfiguration(locations={"file:WebContent/WEB-INF/springMVCForm-servlet.xml"})  

使用注解时,Junit报错:

[java] view plaincopyprint?
  1. java.lang.NoSuchFieldError: NULL  
  2.     at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)  
  3.     at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:58)  
  4.     at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)  
  5.     at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)  
  6.     at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)  
  7.     at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)  
  8.     at java.lang.reflect.Constructor.newInstance(Constructor.java:513)  
  9.     at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)  
  10.     at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)  
  11.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)  
  12.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)  
  13.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)  
  14.     at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)  
  15.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)  
  16.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)  
  17.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)  
  18.     at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)  
经检查是jar包冲突,我在建项目的时候,myeclipse有自动加入junit4,而后面我又自己加入Junit4.8.1。
如果报以下错误,则是junit包版本太低,需要4.5或以上的版本:
[java] view plaincopyprint?
  1. Caused by: java.lang.ClassNotFoundException: org.junit.runners.BlockJUnit4ClassRunner    
  2.     at java.net.URLClassLoader$1.run(URLClassLoader.java:200)    
  3.     at java.security.AccessController.doPrivileged(Native Method)    
  4.     at java.net.URLClassLoader.findClass(URLClassLoader.java:188)    
  5.     at java.lang.ClassLoader.loadClass(ClassLoader.java:307)    
  6.     at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)    
  7.     at java.lang.ClassLoader.loadClass(ClassLoader.java:252)    
  8.     at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)  

#


参考资料:http://blog.csdn.net/dyllove98/article/details/8588790