在spring和junit整合中出现java.lang.NoClassDefFoundError: javax/servlet/ServletContext错误?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在spring和junit整合中出现java.lang.NoClassDefFoundError: javax/servlet/ServletContext错误?相关的知识,希望对你有一定的参考价值。

我印象里好像也出现过,我把我的配置方式给你说一下,你看能不能跑起来。

如果你是springMVC可以采用下面说的,springboot另说,更简单。

首先这几个jar得有:junit-4.12.jar、hamcrest-core-1.3.jar和spring-test-4.3.6.RELEASE.jar。

其次你看下我的Test类:

两个关键的注解:

@RunWith(SpringJUnit4ClassRunner.class),这个这么用就行了。

@ContextConfiguration(locations = "classpath:web/WEB-INF/applicationContext.xml")

这个比较关键,你要告诉它MVC的上下文配置文件在哪里,这是我的test目录路径:

所以我填的是classpath:web/WEB-INF/applicationContext.xml

参考技术A

有可能是xml文件中spring-test的版本号的问题,如果我把spring-test版本号改成5.0.4的话就会出现同样的问题。另外spring5.x的版本,要求junit的jar必须是4.12及以上。


Spring整合junit测试

本节内容:

  • Spring整合junit测试的意义
  • Spring整合junit测试

 

一、Spring与整合junit测试的意义

在没整合junit之前,我们在写测试方法时,需要在每个方法中手动创建容器,获取对象,比如下面的代码,红色部分都是重复的代码。如果要测试很多功能的话,每次都得手动去创建容器,很麻烦。如果你测试的两个功能中用到某个相同的对象,获取对象的代码也得写一遍。

public class test {

    @Test
    public void test1(){
        //1.创建容器对象(创建Spring的工厂类)
        ApplicationContext ac = new ClassPathXmlApplicationContext("com/wisedu/annotation/applicationContext.xml"); //ClassPathXmlApplicationContext(从类路径下加载xml的Application容器)是org.springframework.context.ApplicationContext的实现类
        //2.向容器"要"User对象(通过工厂解析XML获取Bean实例)
        User user = (User)ac.getBean("user");
        //3.打印User对象
        System.out.print(user);

    }

    @Test
    public void test2(){
        //1.创建容器对象(创建Spring的工厂类)
        ApplicationContext ac = new ClassPathXmlApplicationContext("com/wisedu/annotation/applicationContext.xml"); //ClassPathXmlApplicationContext(从类路径下加载xml的Application容器)是org.springframework.context.ApplicationContext的实现类
        //2.向容器"要"User对象(通过工厂解析XML获取Bean实例)
        User user = (User)ac.getBean("user");
        User user2 = (User)ac.getBean("user");
        User user3 = (User)ac.getBean("user");
        //3.打印User对象
        System.out.print(user==user2);

    }
}

Spring比较体贴,Spring可以整合Junit测试,使用更加便捷的方式在测试代码中使用容器的对象。这个知识点只是为了在测试时更加方便,不使用也没有关系。

 

二、Spring整合junit测试

1. 需要引入一个新的jar包

spring-test-4.2.4.RELEASE.jar

 

2. 使用注解

@RunWith(SpringJUnit4ClassRunner.class) //帮我们创建容器

但是由于Spring配置文件位置和名字任意,所以得指明配置文件位置和名称。

@ContextConfiguration("classpath:com/wisedu/annotation/applicationContext.xml") //指定创建容器时使用哪个文件
//@ContextConfiguration(locations = "classpath:com/wisedu/annotation/applicationContext.xml")

另外,原来在每个测试方法里都要手动获取对象,现在我们可以使用为变量注入值:

@Resource(name = "user")
private User u;

编写测试方法:

@Test
public void test3(){
    System.out.print(u);

}

这样每个测试方法里都不需要手动创建容器和手动获取对象了。

整个代码如下:

@RunWith(SpringJUnit4ClassRunner.class) //帮我们创建容器
@ContextConfiguration("classpath:com/wisedu/annotation/applicationContext.xml") //指定创建容器时使用哪个文件
//@ContextConfiguration(locations = "classpath:com/wisedu/annotation/applicationContext.xml")
public class test {
    //将名为user的对象注入到u变量中
    @Resource(name = "user")
    private User u;

    @Test
    public void test3(){
        System.out.print(u);

    }
}

 

以上是关于在spring和junit整合中出现java.lang.NoClassDefFoundError: javax/servlet/ServletContext错误?的主要内容,如果未能解决你的问题,请参考以下文章

Spring整合junit测试

Spring-整合Junit

08-spring整合 junit

spring入门-整合junit和web

Spring整合junit

Spring整合Junit