`
bjtale
  • 浏览: 29603 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Spring框架进行Service和DAO单元测试

阅读更多

Spring在J2EE开发中已经应用得十分广泛,在进行实际开发时,往往需要对Service和DAO层进行单元测试。本文基于Spring框架,使用Jnit4进行单元测试。

项目结构主要包括:DAO层接口和实现,Service层接口和实现,配置文件及测试用例。

主要jar包通过maven进行管理,pom.xml关键配置信息如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com</groupId>
	<artifactId>mall</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>springmvc Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<properties>
		<!-- spring版本号 -->
		<spring.version>3.2.5.RELEASE</spring.version>
		<!-- mybatis版本号 -->
		<mybatis.version>3.2.5</mybatis.version>
		<!-- log4j日志文件管理包版本 -->
		<slf4j.version>1.6.6</slf4j.version>
		<log4j.version>1.2.9</log4j.version>
	</properties>
	<dependencies>
		<!-- spring核心包 -->
		<!-- springframe start -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-oxm</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${spring.version}</version>
		</dependency>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<!-- springframe end -->
		<!-- junit测试包 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.11</version>
			<scope>test</scope>
		</dependency>
	</dependencies>
	<build>
		<finalName>springmvc</finalName>
	</build>
</project>

 DAO层及实现示例代码:

package com.mall.dao;

public interface TestDAO {
	public void save(String str);
}

 

package com.mall.dao.impl;

import java.util.logging.Logger;

import com.mall.dao.TestDAO;

public class TestDAOImpl implements TestDAO{
	private Logger logger = Logger.getLogger(TestDAO.class.getName());
	
	public void save(String str) {
		logger.info("This is DAO args:"+str);
	}

}

 Service层及实现:

package com.mall.service;

public interface TestService {
	public void save(String str);
}

 

package com.mall.service.impl;

import java.util.logging.Logger;

import com.mall.dao.TestDAO;
import com.mall.service.TestService;

public class TestServiceImpl implements TestService{
	private Logger logger = Logger.getLogger(TestServiceImpl.class.getName());
	private TestDAO dao;
	
	public void save(String str) {
		logger.info("Service entered arg:"+str);
		str = str + " has been modified";
		dao.save(str);
	}
	public void setDao(TestDAO dao) {
		this.dao = dao;
	}

}

 spring容器配置文件:spring-test.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
      http://www.springframework.org/schema/context
      http://www.springframework.org/schema/context/spring-context.xsd">
      <bean id="TestService" class="com.mall.service.impl.TestServiceImpl">
      	<property name="dao" ref="TestDAO"></property>
      </bean>
	 <bean id="TestDAO" class="com.mall.dao.impl.TestDAOImpl">
	 </bean>
 </beans>

 下面开始编写测试用例,在进行测试之前,需要统一加载配置文件,并提供产生Bean的方法,考虑使用以下基础测试类来提供公共测试环境:

package com.mall.util;

import org.junit.After;
import org.junit.Before;
import org.springframework.beans.BeansException;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.util.StringUtils;


public class UnitTestBase {
	private ClassPathXmlApplicationContext context;
	private String springXmlpath;
	public UnitTestBase() {}
	
	public UnitTestBase(String springXmlpath) {
		this.springXmlpath = springXmlpath;
	}
	
	@Before
	public void before() {
		if (StringUtils.isEmpty(springXmlpath)) {
			springXmlpath = "classpath*:spring-*.xml";
		}
		try {
			context = new ClassPathXmlApplicationContext(springXmlpath.split("[,\\s]+"));
			context.start();
		} catch (BeansException e) {
			e.printStackTrace();
		}
	}
	
	@After
	public void after() {
		context.destroy();
	}
	
	@SuppressWarnings("unchecked")
	protected <T extends Object> T getBean(String beanId) {
		try {
			return (T)context.getBean(beanId);
		} catch (BeansException e) {
			e.printStackTrace();
			return null;
		}
	}
	
	protected <T extends Object> T getBean(Class<T> clazz) {
		try {
			return context.getBean(clazz);
		} catch (BeansException e) {
			e.printStackTrace();
			return null;
		}
	}

}

 在书写测试用例时,使用Junit4提供的注解:

package mall.test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.BlockJUnit4ClassRunner;

import com.mall.service.impl.TestServiceImpl;
import com.mall.util.UnitTestBase;

@RunWith(BlockJUnit4ClassRunner.class)
public class TestInj extends UnitTestBase{
	public TestInj(){
		super("classpath:spring-test.xml");
	}
	@Test
	public void test(){
		TestServiceImpl service = super.getBean("TestService");
		service.save("Idiot.");
	}
}

 将测试用例作为Junit TestCase运行,将看到控制台输出以下内容:

log4j:WARN No appenders could be found for logger (org.springframework.core.env.StandardEnvironment).

log4j:WARN Please initialize the log4j system properly.

十一月 17, 2015 7:37:04 下午 com.mall.service.impl.TestServiceImpl save

INFO: Service entered arg:Idiot.

十一月 17, 2015 7:37:04 下午 com.mall.dao.impl.TestDAOImpl save

INFO: This is DAO args:Idiot. has been modified

表明Service层对DAO层的调用测试通过。

实际开发中,Service层往往具有更为复杂的业务逻辑,而DAO层通常仅负责与数据库进行交互,使用这种测试方法能较好地完成业务层和数据库操作层的单元测试。

 

 

分享到:
评论

相关推荐

    SpringBoot 多模块Dao层单元测试

    在Java和Spring Boot环境中,我们可以使用JUnit框架来进行单元测试,同时结合Mockito等工具来模拟对象行为,以便专注于测试目标方法。 对于多模块的Spring Boot项目,每个模块可能包含不同的组件,如Service层、...

    Struts+Spring框架下的单元测试[总结].pdf

    总之,单元测试是保证代码质量的重要手段,在Struts+Spring的环境下,需要结合JUnit和Mockito等工具,对Action、Service和DAO进行有效的测试,确保每一层的功能都能够正确无误地工作。通过详尽的测试,可以提前发现...

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    在 Struts2+Spring+Hibernate 框架中,对 Action 的单元测试环境的搭建是一个非常重要的步骤。本文将详细介绍如何在 Struts2+Spring+Hibernate 框架中搭建 Action 的单元测试环境。 首先,需要了解为什么需要对 ...

    07. Spring Boot单元测试

    在Spring Boot框架中,单元测试是一项至关重要的任务,它能够帮助开发者确保代码的正确性和可靠性。Spring Boot提供了方便的工具和库,使得编写和执行单元测试变得简单高效。本章节我们将深入探讨Spring Boot中的...

    spring_day01_all.zip_Action!_ioc mechanism_service调用dao

    在SSH整合开发中,利用Spring管理Service、DAO等组件,利用IoC机制实现Action和Service,Service和DAO之间低耦合调用。利用AoP机制实现事务管理、以及共通功能的切入等。 功能是整合,好处是解耦。

    Spring的作用贯穿了整个中间层,将Web层、Service层、DAO层及PO无缝整合

    2. **分层设计**:Spring框架支持分层的设计模式,这意味着不同的业务功能可以被封装在不同的层中,例如Web层负责处理用户界面,Service层处理业务逻辑,DAO层处理数据访问。这样的设计有助于保持代码的清晰度,并...

    SSM框架下基本的mapper,dao,service,controller等相关文件的整理

    在Service层中,我们可以使用Spring框架提供的依赖注入机制,来将Dao层的对象注入到Service层中,从而实现业务逻辑与数据访问之间的交互。 Controller层 Controller层是SSM框架中的Web层,负责将用户请求与业务...

    spring3学习笔记(2)-集成ibatis3进行单元测试

    在本篇“Spring3学习笔记(2)-集成ibatis3进行单元测试”中,我们将深入探讨如何在Spring3框架中整合Ibatis3,并利用它来进行单元测试。这个主题对于理解如何在实际项目中实现数据访问层的测试具有重要意义。在现代...

    Spring框架的流程

    Spring框架是Java开发中广泛使用的轻量级框架,它提供了一种依赖注入(Dependency Injection,DI)的方式,简化了对象之间的交互和应用的结构。在Spring框架的流程中,主要涉及以下几个核心步骤和概念: 1. **导入...

    Struts+Spring框架下的单元测试[收集].pdf

    在Struts和Spring框架集成的项目中,单元测试是非常重要的一个环节,它有助于确保代码的正确性和可维护性。单元测试通常是对单个组件,如Action、Service或DAO类进行独立的测试,以验证它们的功能是否按预期工作。...

    struts2+hibernate+spring框架整合实列

    8. **测试和优化**:完成上述配置后,通过单元测试和集成测试确保各个组件协同工作。根据性能需求,可能还需要进行一些优化,例如缓存管理、数据库查询优化等。 整合这三个框架可以极大地提升开发效率,使得开发者...

    spring3 + mybatis3 + junit4 可运行项目示例

    这个项目的核心是利用Spring作为应用的ioc(Inversion of Control,控制反转)和aop(Aspect Oriented Programming,面向切面编程)容器,MyBatis作为持久层框架,以及JUnit4用于进行单元测试和集成测试。...

    Spring框架源码

    Spring框架是中国著名的开源Java应用程序框架,它以其依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)的核心特性,极大地简化了Java企业级应用的开发工作。Spring框架的...

    Service层和DAO层解析

    Spring框架通过依赖注入(Dependency Injection,DI)实现了这一目标,使得Service层可以通过接口引用DAO层的实现,而不是直接创建DAO实例。这增强了系统的可测试性和可扩展性,因为Service层可以通过配置文件或注解...

    Spring框架的示例项目源码 Spring Petclinic

    Spring Petclinic包含了详尽的单元测试和集成测试,使用了JUnit和Mockito等测试工具。这些测试确保了代码的质量,并帮助开发者在改动代码后快速验证其功能是否正确。 总之,Spring Petclinic项目是一个全面的学习...

    spring3 mvc 注解action dao service 实例教程

    Spring框架自诞生以来一直致力于为复杂的软件工程问题提供简洁且非侵入式的解决方案。随着版本的演进,Spring 2.0 引入了定制命名空间功能以减少XML配置文件的数量,这一特性在后续版本中得到了广泛应用。到了Spring...

    Spring+SpringMVC+Mybatis框架整合例子(SSM) 下载

    这样,我们可以更容易地进行单元测试和解耦。Spring还支持AOP,允许我们编写关注点分离的代码,如日志、事务管理等。 SpringMVC是Spring框架的一部分,专门用于构建Web应用的MVC框架。它负责处理HTTP请求,将请求...

    Spring Boot从Controller层进行单元测试的实现

    使用了`@RunWith(SpringRunner.class)`注解来启动Spring的测试支持,`@SpringBootTest`注解表明这是一个Spring Boot的测试,而`@WebAppConfiguration`则告诉Spring框架这是一个Web应用程序的测试。 在`...

    ssm(Spring-springMVC-Mybatis)通用Dao框架

    **Spring框架**是整个SSM中的核心,它提供了一个全面的编程和配置模型,用于管理应用的组件和服务。Spring通过依赖注入(Dependency Injection,DI)和面向切面编程(Aspect-Oriented Programming,AOP)来简化Java...

Global site tag (gtag.js) - Google Analytics