1. 程式人生 > >Cannot resolve symbol 'SpringJUnit4ClassRunner'

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查詢它。

 這個問題其實你因為你不熟悉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<