Cannot resolve symbol 'SpringJUnit4ClassRunner'
ps:idea開啟之後,發現test類報錯:Cannot resolve symbol 'SpringJUnit4ClassRunner',註解全部爆紅
package com.it; import com.it.config.SpringConfiguration; import com.it.entity.Student; import com.it.service.StudentService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; /** * ** * * 使用Junit單元測試:測試我們的配置 * * Spring整合junit的配置 * * 1、匯入spring整合junit的jar:spring-test(座標) * * 2、使用Junit提供的一個註解把原有的main方法替換了,替換成spring提供的 * * @Runwith * * 3、告知spring的執行器,spring和ioc建立是基於xml還是註解的,並且說明位置 * * @ContextConfiguration * * locations:指定xml檔案的位置,加上classpath關鍵字,表示在類路徑下 * * classes:指定註解類所在地位置 * * * * 當我們使用spring 5.x版本的時候,要求junit的jar必須是4.12及以上 * */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = SpringConfiguration.class) public class TestClient { @Autowired private StudentService as; @Test public void findAll(){ List<Student> studentList =as.findAllStudent(); for (Student student:studentList) { System.out.println(student); } } @Test public void findbyidtest() { //ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml"); Student student = as.findByid(4); System.out.println(student); } @Test public void saveTest() { Student student=new Student(); student.setId(7); student.setStuno("10007"); student.setName("陳多糖"); student.setClassid(2); as.saveStudent(student); } @Test public void updatetest() { Student student = as.findByid(4); student.setName("陳柳柳"); as.updateStudent(student); } @Test public void deletetest() { ApplicationContext ac = new ClassPathXmlApplicationContext("ApplicationContext.xml"); StudentService as = ac.getBean("studentService", StudentService.class); as.deleteStudent(7); } }
去掉<scope>test</scope>,去掉之後就可以執行成功但是這個是什麼原因啦??我們的先了解一下pom依賴中<scope>????</scope>的含義是什麼
在一個maven專案中,如果存在編譯需要而釋出不需要的jar包,可以用scope標籤,值設為provided。如下:
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
<classifier />
</dependency>
scope的其他引數如下:
-
- compile
預設的scope,表示 dependency 都可以在生命週期中使用。而且,這些dependencies 會傳遞到依賴的專案中。適用於所有階段,會隨著專案一起釋出 - provided
跟compile相似,但是表明了dependency 由JDK或者容器提供,例如Servlet AP和一些Java EE APIs。這個scope 只能作用在編譯和測試時,同時沒有傳遞性。???????? - runtime
表示dependency不作用在編譯時,但會作用在執行和測試時,如JDBC驅動,適用執行和測試階段。 - test
表示dependency作用在測試時,不作用在執行時。 只在測試時使用,用於編譯和執行測試程式碼。不會隨專案釋出。 - system
跟provided 相似,但是在系統中要以外部JAR包的形式提供,maven不會在repository查詢它。
- compile
這個問題其實你因為你不熟悉maven檔案結構所致.測試類一般是放在src/test/java,而不是放在src/main/java下.maven在編譯的時候,src/main/java下是不引用<scope>test</scope>的jar,而編譯src/test/java下的測試這會引用<scope>test</scope>的jar,原因可能就是當使用Junit提供的一個註解把原有的main方法替換了,替換成spring提供的 @Runwith的後,<scope>????<scope>這個時候裡面的值就不用test了,test是在測試的時候才起作用,不測試的是不起作用的,要是有的話,這個時候就會找不到SpringJUnitClassRunner.class<