测试对于保证软件开发质量有着非常重要的作用,单元测试更是必不可少, JUnit 是一个非常强大的单元测试包,可以对一个 / 多个类的单个 / 多个方法测试,还可以将不同的 TestCase 组合成 TestSuit ,使测试任务自动化。 Eclipse 同样集成了 JUnit ,可以非常方便地编写 TestCase 。
一、 JUnit 核心
JUnit 的目的是协助您进行单元测试( Unit Test ),并鼓励您先写测试。
JUnit 包括了以下的特性:
对预期结果作断言
提供测试装备的生成与销毁
易于组织与执行测试
图型与文字介面的测试器
JUnit 的核心类:TestCase、TestSuite以及BaseTestRunner,其中用的最多的就是TestCase,当需要多个TestCase的时候就要创建一个TestSuite,而运行TestSuite则要创建TestRunner,其关系如下:
核心类定义:
TestCase (测试用例) —— 扩展了JUnit的TestCase类的类。它以testXXX方法的形式包含一个或多个测试。一个test case把具有公共行为的测试归入一组。在本书的后续部分,当我们提到测试的时候,我们指的是一个testXXX方法;当我们提及test case的时候,我们指的是一个继承自TestCase的类,也就是一组测试。
TestSuite (测试集合 )——一组测试。一个test suite是把多个相关测试归入一组的便捷方式。例如,如果你没有为TestCase定义一个test suite,那么JUnit就会自动提供一个test suite,包含TestCase中所有的测试(本书稍后会细说)。
TestRunner (测试运行器 )——执行test suite的程序。JUnit提供了几个test runner,你可以用它们来执行你的测试。没有TestRunner接口,只有一个所有test runner都继承的BaseTestRunner。因此,当我们编写TestRunner的时候,我们实际上指的是任何继承BaseTestRunner的test runner类。
其中TesetCase主要有10个自己的方法:
二、下面就以Eclipse中单个TestCase为例子讲一下普通的JUnit测试:
首先我们创建一个 Java 工程,添加一个 example.Hello 类,首先我们给 Hello 类添加一个 abs() 方法,作用是返回绝对值:
下一步,我们准备对这个方法进行测试,确保功能正常。选中 Hello.java ,右键点击,选择 New->JUnit Test Case :
Eclipse 会询问是否添加 junit.jar 包,确定后新建一个 HelloTest 类,用来测试 Hello 类。
选中 setUp() 和 tearDown() ,然后点击 “Next” :
选择要测试的方法,我们选中 abs(int) 方法,完成后在 HelloTest.java 中输入:
JUnit 会以以下顺序执行测试:(大致的代码)
try {
HelloTest test = new HelloTest(); // 建立测试类实例
test.setUp(); // 初始化测试环境
test. testAbs (); // 测试某个方法
test.tearDown(); // 清理资源
}
catch…
setUp() 是建立测试环境,这里创建一个 Hello 类的实例; tearDown() 用于清理资源,如释放打开的文件等等。以 test 开头的方法被认为是测试方法, JUnit 会依次执行 testXxx() 方法。在 testAbs() 方法中,我们对 abs() 的测试分别选择正数,负数和 0 ,如果方法返回值与期待结果相同,则 assertEquals 不会产生异常。
如果有多个 testXxx 方法, JUnit 会创建多个 XxxTest 实例,每次运行一个 testXxx 方法, setUp() 和 tearDown() 会在 testXxx 前后被调用,因此,不要在一个 testA() 中依赖 testB() 。
直接运行 Run->Run As->JUnit Test ,就可以看到 JUnit 测试结果:
绿色表示测试通过,只要有 1 个测试未通过,就会显示红色并列出未通过测试的方法。可以试图改变 abs() 的代码,故意返回错误的结果(比如 return n+1; ),然后再运行 JUnit 就会报告错误。
三、在 Spring 中进行 DAO 测试
Spring 提供了下列一些特定的JUnit框架扩展:
AbstractDependencyInjectionSpringContextTests— 这是一个针对所有测试的超类,其具体使用依赖于Spring上下文。
AbstractSpringContextTests— 这是一个针对所有的JUnit测试情形的超类。它使用一个Spring上下文。并且,一般在测试中不是直接使用它,而是使用AbstractDependencyInjectionSpringContextTests或者AbstractTransactionalSpringContextTests这样的派生类。
AbstractTransactionalSpringContextTests— 这是一个针对所有测试的超类,我们一般把它应用在事务相关的测试中。注意,一旦完成每个测试它就会正常地回滚事务;而且你需要重载onSetUpInTransaction和onTearDownInTransaction方法以便手工开始并提交事务。
AbstractTransactionalDataSourceSpringContextTests— 这是AbstractTransactionalSpringContextTests的一个子类,它使用了Spring的基于JDBC的jdbcTemplate工具类。
所有上面这些扩展将极大程度地简化在测试时对于相关操作的依赖性注入和事务管理。
下面就以一个用户 DAO 类 HibernateUserDao 类中的一个方法 getPasswordByName(String userName) 进行测试作为例子,其中的输入就是用户名,输出就是用户密码:
测试类:
//HibernateUserDAOTest.java
public class HibernateUserDAOTest extends AbstractTransactionalDataSourceSpringContextTests
{
ApplicationContext applicationContext ;
HibernateUserDAO hub ;
@Override
protected String[] getConfigLocations()
{
String[] config= new String[]{ "file:D:\\RfidStock2\\WebRoot\\WEB-INF\\classes\\applicationContext.xml" };
return config;
}
public ApplicationContext getContext(String[] filePath)
{
return new ClassPathXmlApplicationContext(filePath);
}
public void testConfig() {
assertNotNull( "spring-mock context has bean init()" , this .getConfigLocations());
}
@Test
public final void testGetPasswordByName() throws BaseException
{
hub =(HibernateUserDAO)getContext(getConfigLocations()).getBean( "hibernateUserDAO" );
assertEquals( "234" , hub . getPasswordByName ( "42" ));
}
public static void main(String[] args)
{
TestRunner.run((Class<? extends TestCase>) HibernateUserDAO. class );
}
}
在 Spring 下由于要驱动 Spring ,所以测试类要继承 AbstractTransactionalDataSourceSpringContextTests 类,需要实现一个方法 String[] getConfigLocations() ,用这个方法来获取 Spring 的配置文件,然后我通过写 getContext(String[] filePath) 这个方法来获取 Spring 的上下文,在这里我们要获取待测试对象有两种方法一种就是 setHibernateUserDAO() 和 getHibernateUserDAO() 方法,另外一种就是通过上下文提取配置文件中定义的 Bean ,然后再获取具体的方法。
=====================================================
在写单元测试的时候,发现AbstractTransactionalDataSourceSpringContextTests等这些类已经过期了,就想到一定会有新的测试工具类,翻了半天的文档,找到了解决方案,下面是使用的例子:
Java代码 收藏代码
@RunWith(SpringJUnit4ClassRunner.class) //指定测试用例的运行器 这里是指定了Junit4
@ContextConfiguration({"/applicationContext-hibernate.xml","/applicationContext-beans.xml"}) //指定Spring的配置文件 /为classpath下
//@Transactional //对所有的测试方法都使用事务,并在测试完成后回滚事务
public class UserServiceImplTest {
// @Autowired
// private ApplicationContext appplicationContext; //自动注入applicationContext,这样就可以使用appli*.getBean("beanName")
@Resource //会自动注入 default by type
private UserDao userDao;
@Resource
private UserService userService;
@Before //在每个测试用例方法之前都会执行
public void init(){
}
@After //在每个测试用例执行完之后执行
public void destory(){
}
@Test
@Transactional //使用该注释会使用事务,而且在测试完成之后会回滚事务,也就是说在该方法中做出的一切操作都不会对数据库中的数据产生任何影响
// @Rollback(false) //这里设置为false,就让事务不回滚
public void testAdd(){
Assert.assertNotNull(userDao);
Assert.assertNotNull(userService);
userDao.add(new User("userDao1","world!"));
userService.registerUser(new User("UserService1","world!"));
}
public void testTest() {
}
}
可以看到很简单的写个@Resource 即可。
--------
不要忘了把spring-test-3.0.0.RELEASE.jar包放到classpath中。
分享到:
相关推荐
在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。这篇博客主要探讨了如何使用JUnit进行Spring MVC Controller的单元测试。在实际开发中,单元测试可以帮助我们尽早发现潜在...
在Spring框架中,进行Junit单元测试是软件开发过程中的重要环节,有助于确保代码的健壮性和可维护性。在本篇文章中,我们将探讨如何利用Spring的MOVE(Model-View-Controller)架构以及JUnit库来执行单元测试。首先...
二、Spring框架的单元测试 1. Spring TestContext Framework:Spring提供的一个测试支持库,它允许我们加载Spring应用上下文,并提供了一套用于测试的工具和API。 2. `@RunWith(SpringRunner.class)`:这是一个...
在Java开发领域,Spring框架是应用最广泛的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)框架之一,而JUnit则是Java语言中进行单元测试的标准库。本篇文章将详细探讨如何在Spring环境中利用...
当我们需要对Spring框架中的组件进行单元测试时,通常会将JUnit与Spring进行整合。本篇文章将详细介绍如何在Spring环境中利用JUnit进行单元测试,以及在这个过程中可能遇到的关键知识点。 首先,我们需要了解Spring...
在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境的搭建是一个非常重要的步骤。本文将详细介绍如何在 Struts2+Spring+Hibernate 框架中搭建 Action 的单元测试环境。 首先,需要了解为什么需要对 ...
JUnit 是 Java 中开发单元测试的框架标准,由 Erich Gamma 和 Kent Beck 创建。它支持测试代码的独立,是 XP 编程思想的体现。JUnit 已经 13 岁了,是一个简单但有效的单元测试框架,世界上无数软件项目使用它。 ...
在Spring框架中,进行Web工程的JUnit单元测试是软件开发中的关键步骤,它能确保代码的质量和可维护性。本文将深入探讨如何利用Spring管理的Web工程进行单元测试,以及如何借助工具提升测试效率。 首先,理解“通过...
单元测试是对程序中最小可测试单元进行验证,通常是单个函数或方法。过去,开发者可能会通过编写main函数来手动测试代码功能,但这种方式效率低下且易于出错。现在,通过JUnit等工具,我们可以更系统、高效地进行...
在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的质量,提前发现潜在问题,并且便于持续集成和重构。本篇内容将基于"27. Spring Boot Junit单元测试【从零开始学Spring Boot】"的...
在Spring框架中,单元测试是非常重要的一环,因为它可以帮助开发者确保代码的质量和稳定性。Junit是Java中最常用的单元测试框架,它提供了一套简单易用的API来编写和执行测试用例。 在Spring框架中,`spring-test`...
Mock是在单元测试中用于模拟复杂依赖关系的技术。Mock对象可以替代真实对象,模拟返回值或行为,以便测试代码可以专注于单个功能,而不会受到外部因素的影响。这在测试涉及网络请求、数据库操作或其他外部资源的代码...
在Spring框架中,JUnit是一个非常流行的单元测试框架,用于对Java代码进行测试。Spring框架对JUnit进行了整合,可以方便地在Spring环境中进行单元测试。 接管JUnit资源是指Spring框架为了方便进行单元测试,在测试...
而JUnit作为Java单元测试的事实标准,是进行精确、高效测试的必备工具。本文将深入探讨如何在Spring4环境中利用JUnit进行简单测试。 首先,让我们了解Spring4中的测试支持。Spring4引入了`@ContextConfiguration`...
提到的hamcrest库(hamcrest-core-1.3.rc2.jar和hamcrest-library-1.3.RC2.jar)是JUnit测试中常用的匹配器库。Hamcrest提供了一套丰富的匹配器(Matcher),使得断言更加灵活和表达力强。比如,我们可以使用`...
这个项目的核心是利用Spring作为应用的ioc(Inversion of Control,控制反转)和aop(Aspect Oriented Programming,面向切面编程)容器,MyBatis作为持久层框架,以及JUnit4用于进行单元测试和集成测试。...
Spring Junit是一个常用的单元测试框架,它可以与Spring框架集成,提供了许多有用的注解和工具来简化单元测试的过程。然而,在使用Spring Junit进行单元测试时,可能会遇到加载配置文件失败的问题。本文将详细介绍这...
`@ContextConfiguration`用于指定应用上下文的配置文件,使我们能够在测试中加载整个Spring应用上下文。`@RunWith(SpringRunner.class)`则是告诉JUnit使用Spring提供的测试运行器,这样可以利用Spring的特性,例如...