Maven管理的Spring Web项目集成JUnit单元测试

简介:
JUnit是一套优秀的 单元测试框架,而Maven是优秀的Java项目构建和管理工具,两者结合可以很方便地对项目进行 自动化测试
  一般的简单Java应用就不多说了,一些框架会提供针对junit的扩展,使得测试变得更容易,例如Spring官方就提供了spring-test,用于提供获取ApplicationContext等方面的支持。
  首先要做的是,改变JUnit的实际执行类,将默认的执行类Suite替换为Spring提供的SpringJUnit4ClassRunner,也就是在测试类前面加上一个注解:
  @RunWith(SpringJUnit4ClassRunner.class)
   然后,我们需要告诉这个测试类Spring配置文件的位置:
@ContextConfiguration(locations={"classpath:applicationContext.xml",
"classpath:applicationContext-security.xml","file:src/main/webapp/WEB-INF/servlet.xml"})
  笔者这里展示了两种配置文件路径的写法。前两个是spring常见的配置文件,放在classpath根目录下,而“file”开头的路径是完全限定路径,默认是相对于实际的项目路径的,例如笔者使用Eclipse进行开发,这个路径的写法是相对于项目文件所在文件夹的根目录的。该写法适用于没有直接放在classpath下的一些 web相关的配置文件,例如本例展示的就是放在常见的WEB-INF目录下的一个文件。
   基于以上描述,笔者写了一个Spring测试基类:
package com.test.basic;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.junit.Before;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={/*"file:src/main/webapp/WEB-INF/wxiot-servlet.xml",*/ "classpath:applicationContext.xml",
"classpath:applicationContext-security.xml"})
public classTestBase {
protected Log logger = LogFactory.getLog(TestBase.class);
@Before
//一些公用的“初始化”代码
public void before(){
}
}


  有了这个基类,我们就可以动手写各个模块的测试类了,只要在定义测试类的时候继承TestBase,并在具体的方法前面加上@Test注解,笔者这里给出一个测试类的简单示例:
import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.reports.util.ActiveMQSender;
import com.test.basic.TestBase;
public classActiveMQSenderTest extends TestBase {
@Autowired
ActiveMQSendersender;
@Test
public void sendQTest(){
Assert.assertNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "20131025102122"));
Assert.assertNotNull(sender.sendInformationQ("发,布。到?队!列“的¥信息", "20131023102122", "2013-10-26 10:21:22"));
}
@Test
public void sendTopicTest(){
Assert.assertNull(sender.sendInformationTopic("发,布。到?Topic!的”信¥息", "20131023102122","20131025102122") );
}
}
  最后执行“RunAs -> JUnit Test”即可开始JUnit单元测试了,使用Maven命令还可以方便地对特定目录下(通常是src/test/java目录)的所有测试类进行批量测试。
  对于Java Web项目,某些业务类可能会带有使用ServletContext等Web容器相关类的代码,对于这些类我们就不能直接用JUnit来测试了,因为默认JUnit是没有Web容器的,我们通常需要借助其它相关的辅助类或者模拟Web容器来进行测试,例如利用struts2-junit-plugin的帮助来测试struts的action,这些内容网上的资料很多,不在本文的讨论范围之内。
  一些用到了web容器的业务类只需稍加修改,就可以直接用于JUnit测试。假设一个业务类使用了ServletContext来获取容器内的资源,例如一个配置文件:
  InputStream is=context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
  其中context变量保存了Web容器的ServletContext,如果直接使用JUnit来测试,必然导致空指针异常。此时我们可以稍作修改:
InputStream is = null;
if(null != context){
is= context.getResourceAsStream("/WEB-INF/configs/command-sender.xml");
}else{//JUnit Test环境下,使用ApplicationContext获取配置文件
//NearEast 2013-10-22
try {
is= SpringContextHolder.getApplicationContext().
getResource("file:src/main/webapp/WEB-INF/configs/command-sender.xml").getInputStream();
}catch(IOException e) {
e.printStackTrace();
}
}
  其中,SpringContextHolder是笔者在《在Java Web应用中获取Spring管理的Bean的方法》提到的一个工具类,SpringContextHolder.getApplicationContext()即获得Spring的ApplicationContext。资源的路径使用了上文提到的完全限定路径,我们也可以将其写为类似“file:E:/Workspaces/workspace_test/test/src/main/webapp/WEB-INF/configs/command-sender.xml"”的形式。经过上述修改之后,我们的业务类也可以直接利用JUnit执行测试了。
  当然我们还可以用其它方式获取ApplicationContext,例如让业务类实现ApplicationContextAware接口,并使用一个变量保存ApplicationContext。


最新内容请见作者的GitHub页:http://qaseven.github.io/

相关文章
|
9月前
|
人工智能 Java 测试技术
Spring Boot 集成 JUnit 单元测试
本文介绍了在Spring Boot中使用JUnit 5进行单元测试的常用方法与技巧,包括添加依赖、编写测试类、使用@SpringBootTest参数、自动装配测试模块(如JSON、MVC、WebFlux、JDBC等),以及@MockBean和@SpyBean的应用。内容实用,适合Java开发者参考学习。
1014 0
|
5月前
|
安全 Java 测试技术
《深入理解Spring》单元测试——高质量代码的守护神
Spring测试框架提供全面的单元与集成测试支持,通过`@SpringBootTest`、`@WebMvcTest`等注解实现分层测试,结合Mockito、Testcontainers和Jacoco,保障代码质量,提升开发效率与系统稳定性。
|
12月前
|
Java Maven 微服务
微服务——SpringBoot使用归纳——Spring Boot集成 Swagger2 展现在线接口文档——Swagger2 的 maven 依赖
在项目中使用Swagger2工具时,需导入Maven依赖。尽管官方最高版本为2.8.0,但其展示效果不够理想且稳定性欠佳。实际开发中常用2.2.2版本,因其稳定且界面友好。以下是围绕2.2.2版本的Maven依赖配置,包括`springfox-swagger2`和`springfox-swagger-ui`两个模块。
522 0
|
8月前
|
Java 测试技术 Spring
简单学Spring Boot | 博客项目的测试
本内容介绍了基于Spring Boot的博客项目测试实践,重点在于通过测试驱动开发(TDD)优化服务层代码,提升代码质量和功能可靠性。案例详细展示了如何为PostService类编写测试用例、运行测试并根据反馈优化功能代码,包括两次优化过程。通过TDD流程,确保每项功能经过严格验证,增强代码可维护性与系统稳定性。
327 0
|
Java 测试技术 开发者
必学!Spring Boot 单元测试、Mock 与 TestContainer 的高效使用技巧
【10月更文挑战第18天】 在现代软件开发中,单元测试是保证代码质量的重要手段。Spring Boot提供了强大的测试支持,使得编写和运行测试变得更加简单和高效。本文将深入探讨Spring Boot的单元测试、Mock技术以及TestContainer的高效使用技巧,帮助开发者提升测试效率和代码质量。
1351 2
|
9月前
|
安全 Java 测试技术
说一说 Spring Security 中的单元测试
我是小假 期待与你的下一次相遇 ~
176 1
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
405 10
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
1131 4
|
存储 人工智能 Java
将 Spring AI 与 LLM 结合使用以生成 Java 测试
AIDocumentLibraryChat 项目通过 GitHub URL 为指定的 Java 类生成测试代码,支持 granite-code 和 deepseek-coder-v2 模型。项目包括控制器、服务和配置,能处理源代码解析、依赖加载及测试代码生成,旨在评估 LLM 对开发测试的支持能力。
564 1
|
Java 应用服务中间件 Maven
idea+maven+tomcat+spring 创建一个jsp项目
这篇文章介绍了如何在IntelliJ IDEA中使用Maven和Tomcat创建一个JSP项目,包括配置Maven依赖、设置Tomcat服务器、编写JSP页面、创建控制器和配置文件,以及项目的运行结果。
1048 0
idea+maven+tomcat+spring 创建一个jsp项目

推荐镜像

更多