Spring MVC Junit測試例項 附:讀取WEB-INF下配置檔案的方法
阿新 • • 發佈:2019-02-19
Spring+Unit測試例項:
之前寫過一個連線資料庫的spring mvc annotation的一個例項(點選這裡檢視)。
當我們啟動Web專案時要先啟動Tomcat,而在Tomcat的啟動過程中會讀取spring專案的的各個配置檔案,例項化各個注入的類,所以我們的程式中直接使用註解就可以操作各個類。
如果報以下錯誤,則是junit包版本太低,需要4.5或以上的版本:
之前寫過一個連線資料庫的spring mvc annotation的一個例項(點選這裡檢視)。
當我們啟動Web專案時要先啟動Tomcat,而在Tomcat的啟動過程中會讀取spring專案的的各個配置檔案,例項化各個注入的類,所以我們的程式中直接使用註解就可以操作各個類。
但是如果按普通的專案測試,就缺少了讀取配置檔案的過程,所以當你呼叫一個類方法時會出現空指標錯誤,因為類沒有例項化。
對Spring MVC Dao的JUnit的測試。
下面是對上面提到的例項中的UserDao.class的測試,內容如下:
右鍵->Run as->JUnit Test執行,無誤。查詢資料庫顯示已經插入資料庫。package org.spring.wayne.dao; import org.junit.Test; import org.junit.runner.RunWith; import org.spring.wayne.web.form.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "file:WebContent/WEB-INF/springMVCForm-servlet.xml" }) public class UserDaoTest { @Autowired private UserDao userDao; @Test public void test() { User user = new User(); user.setUserName("u"); user.setPassword("p"); userDao.addUser(user); } }
對Spring MVC Controller的JUnit的測試。
下面是對上面提到的例項中的RegController.class的測試,內容如下:
右鍵->Run as->JUnit Test執行,無誤。package org.spring.wayne.web.controller; import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.spring.wayne.web.form.User; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.ui.ExtendedModelMap; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; public class RegControllerTest { @Mock private BindingResult mockBindingResult; @Before public void setUp() { MockitoAnnotations.initMocks(this); Mockito.when(mockBindingResult.hasErrors()).thenReturn(true); } @Test public void test() throws Exception { MockHttpServletRequest request = new MockHttpServletRequest(); MockHttpServletResponse response = new MockHttpServletResponse(); RegController regController = new RegController(); Model model = new ExtendedModelMap(); User user = new User(); user.setUserName("uuuuuuu"); user.setPassword("ppppppp"); String result = regController.handler(user, mockBindingResult, model, request, response); System.out.println(result); assertEquals("register", result); } @After public void destroy() { } }
讀取WEB-INF下配置檔案的方法:
配置檔案放在class目錄下:
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("springMVCForm-servlet.xml");
WEB-INF下:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WebContent/WEB-INF/springMVCForm-servlet.xml");
多個檔案可用*表示:
ApplicationContext applicationContext = new FileSystemXmlApplicationContext("WebContent/WEB-INF/springMVCForm-*.xml");
註解方式:配置檔案放在class目錄下:
@ContextConfiguration(locations={"classpath:springMVCForm-servlet.xml"})
WEB-INF下:
@ContextConfiguration(locations={"file:WebContent/WEB-INF/springMVCForm-servlet.xml"})
使用註解時,Junit報錯:
java.lang.NoSuchFieldError: NULL
at org.junit.runners.ParentRunner.<init>(ParentRunner.java:48)
at org.junit.runners.BlockJUnit4ClassRunner.<init>(BlockJUnit4ClassRunner.java:58)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:104)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
at org.junit.internal.requests.ClassRequest.buildRunner(ClassRequest.java:33)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:28)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.<init>(JUnit4TestReference.java:33)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestClassReference.<init>(JUnit4TestClassReference.java:25)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:48)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:452)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
經檢查是jar包衝突,我在建專案的時候,myeclipse有自動加入junit4,而後面我又自己加入Junit4.8.1。如果報以下錯誤,則是junit包版本太低,需要4.5或以上的版本:
Caused by: java.lang.ClassNotFoundException: org.junit.runners.BlockJUnit4ClassRunner
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
#