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

简介: 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。

目录
相关文章
|
3月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
471 0
|
21天前
|
Java 测试技术 API
自动化测试工具集成及实践
自动化测试用例的覆盖度及关键点最佳实践、自动化测试工具、集成方法、自动化脚本编写等(兼容多语言(Java、Python、Go、C++、C#等)、多框架(Spring、React、Vue等))
65 6
|
3月前
|
Web App开发 开发框架 .NET
Playwright 自动化测试系列(6)| 第三阶段:测试框架集成​指南:参数化测试 + 多浏览器并行执行
Pytest 与 Playwright 集成可提升自动化测试效率,支持参数化测试、多浏览器并行执行及统一报告生成。通过数据驱动、Fixture 管理和并行优化,显著增强测试覆盖率与执行速度,适用于复杂 Web 应用测试场景。
|
3月前
|
测试技术 API C++
Playwright 自动化测试系列(7)| 第三阶段:测试框架集成​​Page Object 模式
本课程详解Playwright测试框架中的Page Object模式,通过电商登录-下单实战演示PO架构设计与高级技巧,结合Pytest实现多用户测试。重点解析PO模式提升代码复用性、降低维护成本的核心价值,并提供常见问题解决方案,助力构建高可维护性的自动化测试体系。
|
4月前
|
人工智能 Java 测试技术
SpringBoot 测试实践:单元测试与集成测试
在 Spring Boot 测试中,@MockBean 用于创建完全模拟的 Bean,替代真实对象行为;而 @SpyBean 则用于部分模拟,保留未指定方法的真实实现。两者结合 Mockito 可灵活控制依赖行为,提升测试覆盖率。合理使用 @ContextConfiguration 和避免滥用 @SpringBootTest 可优化测试上下文加载速度,提高测试效率。
259 6
|
8月前
|
存储 人工智能 测试技术
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
141457 29
小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
|
11月前
|
敏捷开发 测试技术 持续交付
探索软件测试中的自动化与持续集成
在快速迭代的软件开发环境中,自动化测试和持续集成(CI)已成为确保产品质量和加速交付的关键策略。本文将深入探讨自动化测试的基本原理、实施步骤以及它如何与持续集成流程相结合,以提高软件开发的效率和可靠性。我们将通过实际案例分析,展示自动化测试和CI的最佳实践,以及它们如何帮助企业实现更快的市场响应时间和更高的客户满意度。
146 16
|
11月前
|
jenkins 测试技术 持续交付
软件测试中的自动化与持续集成:提升效率与质量的关键
在快节奏的软件开发环境中,自动化测试和持续集成已经成为不可或缺的部分。本文将探讨自动化测试和持续集成的重要性,以及它们如何协同工作以提高软件开发的效率和质量。通过分析自动化测试的策略、工具选择以及持续集成的实践,我们将揭示这些技术如何帮助开发团队快速响应变化,减少错误,并加速产品上市时间。
|
11月前
|
机器学习/深度学习 人工智能 jenkins
软件测试中的自动化与持续集成实践
在快速迭代的软件开发过程中,自动化测试和持续集成(CI)是确保代码质量和加速产品上市的关键。本文探讨了自动化测试的重要性、常见的自动化测试工具以及如何将自动化测试整合到持续集成流程中,以提高软件测试的效率和可靠性。通过案例分析,展示了自动化测试和持续集成在实际项目中的应用效果,并提供了实施建议。
|
11月前
|
前端开发 JavaScript 测试技术
前端测试技术中,如何提高集成测试的效率?
前端测试技术中,如何提高集成测试的效率?

推荐镜像

更多