`

SSH+Log4j+JUnit+MySql整合Web Project练习小结,重点在Spring上如何进行JUnit测试

阅读更多

前3天都是单独小练习,今天做一个整合小练习,看看会不会出现一些问题。。。

 

例子很简单,Spring 3 + Struts 2 + Hibernate 3 + Log4j 1.2.14 + Junit 4.8.1 + MySql 5.5

 

基于上述技术实现一个超简单的Web Project 功能就是CRUD。。。(登录+管理)。。。go go go。。。

 

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

 

 

 

文中只列出一些在操作中要注意的事项,和遇到的问题而已。

 

 

 

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

这次把Spring的配置文件applicationContext.xml放在了src下。

 

(其实,平时习惯放在WEB-INF下,但在JUnit测试的时候我自己找不对路径,所以放src下用classpath来设置了)

 

当然,放在src下,就要在Web.xml中配置路径参数:

 

<context-param>
	<param-name>contextConfigLocation</param-name>
	<param-value>classpath:applicationContext.xml</param-value>
</context-param>

 

JUnit:

 

针对用户业务层的 UserinfoBizImp 类做了测试,如下UserinfoBizImplTest:

 

这里会用到Spring框架中的一个test架包,是我在练习时单独添加的,末段提供下载。

其他jar包基本都是MyEclipse提供的,。

 

package com.mysqlweb.biz.impl;

import java.util.List;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import com.mysqlweb.biz.UserinfoBiz;
import com.mysqlweb.entity.Userinfo;

/**
 * 
 * @author Maxpin on 2011-10-04
 *
 *	UserinfoBizImpl测试类
 */
@RunWith(SpringJUnit4ClassRunner.class)//org.springframework.test.context.junit4.SpringJUnit4ClassRunner
@ContextConfiguration(locations={"classpath:applicationContext.xml"})  //配置Spring配置文件路径
public class UserinfoBizImplTest {
	
	@Autowired	//自动装配注入
	UserinfoBiz userBiz;
	
	@Test
	public void testLogin(){
		//测试登录
		userBiz.login("admin", "123123");
	}
	@Test
	public void testQueryUserinfoById(){
		//测试查询单个
		Userinfo user = userBiz.getUserinfoById(1);
		System.out.println(user.getUsername());
	}
	@Test
	public void testQueryUserinfoList(){
		//测试查询所有
		List<Userinfo> userList = userBiz.getUserinfoList();
		for(Userinfo user : userList){
			System.out.println(user.getUsername());
		}
	}
}

 

 

 

log4j.properties中没什么变化,也在src下:

 

 

log4j.rootLogger = info,CONSOLE,ROLLING_FILE
log4j.addivity.org.apache=true 

 

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %c %x - %m%n
 
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=info
log4j.appender.ROLLING_FILE.File=F\:/MyEclipse 9/logs/mysqlweb/rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=1024KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=10
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern= %d - %c -%-4r [%t] %-5p %c %x - %m%n

 

##Hibernate log begin##
log4j.logger.org.hibernate=info
log4j.logger.org.hibernate.SQL=debug
log4j.logger.org.hibernate.HQL=debug
##Hibernate log end##

  

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

下面是网上搜集来的基于Spring框架的JUnit测试方法,方便以后开发转过来了。感谢原作者。

 

 

一、AbstractDependencyInjectionSpringContextTests

 

  

 

public class AuctionUserDaoTest extends AbstractDependencyInjectionSpringContextTests
{

    //重写该方法

    public String[] getConfigLocations()
    {
        String[] configLocations = {"daoContext.xml","applicationContext.xml"};
        return configLocations;
    }

    AuctionUserDao auctionUserDao;

  

    public void setAuctionUserDao(AuctionUserDao auctionUserDao) {
        this.auctionUserDao = auctionUserDao;
    }


  
    public void testFindAll()
    {
      
    }

  
}

单元测试只要继承AbstractDependencyInjectionSpringContextTests,并重写getConfigLocations方法,就可以引入要依赖的bean.继承 AbstractDependencyInjectionSpringContextTests单元测试的方法不会进行回滚。

 

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

二、AbstractAnnotationAwareTransactionalTests

 

 

 

public class BidDaoTest extends AbstractAnnotationAwareTransactionalTests
{

    private BidDao bidDao;

    public void setBidDao(BidDao bidDao) {
        this.bidDao = bidDao;
    }

    public String[] getConfigLocations()
    {
        String[] configLocations = {"daoContext.xml","applicationContext.xml"};
        return configLocations;
    }
   
    @Rollback(false)
    public void testFindByUser()
    {
     
    }

  }

 

单元测试继承AbstractAnnotationAwareTransactionalTests,虽然里面有一个注释熟悉Rollback,但是测试了很多次,发现该属性没有效果,不清楚到底还有什么地方要设置一下,继承了AbstractAnnotationAwareTransactionalTests,所有的测试方法都是会回滚,刚好跟AbstractDependencyInjectionSpringContextTests类相反

 

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

三、@RunWith(SpringJUnit4ClassRunner.class)

 

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"../../../applicationContext.xml","../../../daoContext.xml"})
@TransactionConfiguration(transactionManager="transactionManager")
@Transactional
public class KindDaoTest
{
    @Autowired
    KindDao kindDao;

    @Test
    @Rollback(false)
    public void findAll()
    {
       
    }

}

 

该单元测试的特点:运用注释,使得编写测试更加简单,以及可以设置是否回滚。

@RunWith(SpringJUnit4ClassRunner.class)

表示该测试用例是运用junit4进行测试,也可以换成其他测试框架

@TransactionConfiguration(transactionManager="transactionManager")为可选项,该项不会影响回滚的设置。

@ContextConfiguration(locations={"../../../applicationContext.xml","../../../daoContext.xml"})

该路径的设置时相当于该单元测试所在的路径,也可以用classpath进行设置,该设置还有一个inheritLocations的属性,默认为true,表示子类可以继承该设置。

@Autowired

表示bean自动加载,而不用像之前的两个类要添加一个set的方法。

@Test

表示该方法是测试用例

@Rollback(false)

表示该测试用例不回滚

 

 

---------------------------------------我是华丽的无所不在的分割线-------------------------------------------

 

 

在使用所有注释前必须使用@RunWith(SpringJUnit4ClassRunner.class),让测试运行于Spring测试环境

 

Spring框架在org.springframework.test.annotation 包中提供了常用的Spring特定的注解集,如果你在Java5或以上版本开发,可以在测试中使用它。

 

@IfProfileValue

 

提示一下,注解测试只针对特定的测试环境。 如果配置的ProfileValueSource类返回对应的提供者的名称值, 这个测试就可以启动。这个注解可以应用到一个类或者单独的方法。

 

@IfProfileValue(name=”java.vendor”, value=”Sun Microsystems Inc.”)
public void testProcessWhichRunsOnlyOnSunJvm() {
// some logic that should run only on Java VMs from Sun Microsystems
}


同时@IfProfileValue可配置一个值列表 (使用OR 语义) 来在JUnit环境中获得TestNG的测试组支持。 看下面的例子:

 

@IfProfileValue(name=”test-groups”, values={”unit-tests”, “integration-tests”})
public void testProcessWhichRunsForUnitOrIntegrationTestGroups() {
// some logic that should run only for unit and integration test groups
}


@ProfileValueSourceConfiguration

 

类级别注解用来指定当通过@IfProfileValue注解获取已配置的profile值时使用何种ProfileValueSource。 如果@ProfileValueSourceConfiguration没有在测试中声明,将默认使用 SystemProfileValueSource。

 

@ProfileValueSourceConfiguration(CustomProfileValueSource.class)
public class CustomProfileValueSourceTests {
// class body…
}


@DirtiesContext

 

在测试方法上出现这个注解时,表明底层Spring容器在该方法的执行中被“污染”,从而必须在方法执行结束后重新创建(无论该测试是否通过)。

 

@DirtiesContext
public void testProcessWhichDirtiesAppCtx() {
// some logic that results in the Spring container being dirtied
}


@ExpectedException

 

表明被注解方法预期在执行中抛出一个异常。预期异常的类型在注解中给定。如果该异常的实例在测试方法执行中被抛出, 则测试通过。同样的如果该异常实例没有在测试方法执行时抛出,则测试失败。

 

@ExpectedException(SomeBusinessException.class)
public void testProcessRainyDayScenario() {
// some logic that should result in an Exception being thrown
}


@Timed

 

表明被注解的测试方法必须在规定的时间区间内执行完成(以毫秒记)。如果测试执行时间超过了规定的时间区间,测试就失败了。

注意该时间区间包括测试方法本身的执行,任何重复测试(参见 @Repeat),还有任何测试fixture的set up或tear down时间。

Spring的@Timed注解与JUnit 4的@Test(timeout=...)支持具有不同的语义。 特别地,鉴于JUnit 4处理测试执行超时(如通过在一个单独的线程中执行测试方法)的方式, 我们不可能在一个事务上下文中的测试方法上使用JUnit的@Test(timeout=...)配置。因此, 如果你想将一个测试方法配置成计时具事务性的, 你就必须联合使用Spring的@Timed@Transactional注解。 还值得注意的是@Test(timeout=...)只管测试方法本身执行的次数,如果超出的话立刻就会失败; 然而,@Timed关注的是测试执行的总时间(包括建立和销毁操作以及重复),并且不会令测试失败。

 

@Timed(millis=1000)
public void testProcessWithOneSecondTimeout() {
// some logic that should not take longer than 1 second to execute
}

@Repeat

 

表明被注解的测试方法必须重复执行。执行的次数在注解中声明。

注意重复执行范围包括包括测试方法本身的执行,以及任何测试fixture的set up或tear down。

 

@Repeat(10)
public void testProcessRepeatedly() {
// …
}

 


@Rollback

 

 

 

表明被注解方法的事务在完成后是否需要被回滚。 如果true,事务将被回滚,否则事务将被提交。 使用@Rollback接口来在类级别覆写配置的默认回滚标志。

 

@Rollback(false)
public void testProcessWithoutRollback() {
// …
}


@NotTransactional

 

出现该注解表明测试方法必须不在事务中执行。

 

@NotTransactional
public void testProcessWithoutTransaction() {
// …
}

 

 

 

Spring TestContext Framework还支持下面这些非特定于测试的注解,并且保持其语义不变。

  • @Autowired
  • @Qualifier
  • @Resource (javax.annotation)如果JSR-250可用
  • @PersistenceContext (javax.persistence)如果JPA可用
  • @PersistenceUnit (javax.persistence)如果JPA可用
  • @Required
  • @Transactional

@TestExecutionListeners

 

定义类级别的元数据,TestExecutionListeners会使用TestContextManager进行注册。 通常,@TestExecutionListeners@ContextConfiguration会搭配使用。

 

@ContextConfiguration
@TestExecutionListeners({CustomTestExecutionListener.class, AnotherTestExecutionListener.class})
public class CustomTestExecutionListenerTests {
    // class body...
}

 

@TransactionConfiguration

 

为配置事务性测试定义了类级别的元数据。特别地,如果需要的PlatformTransactionManager不是“transactionManager”的话, 那么可以显式配置驱动事务的PlatformTransactionManager的bean名字。此外, 可以将defaultRollback标志改为false。通常, @TransactionConfiguration@ContextConfiguration搭配使用。

 

@ContextConfiguration
@TransactionConfiguration(transactionManager="txMgr", defaultRollback=false)
public class CustomConfiguredTransactionalTests {
    // class body...
}

 

@BeforeTransaction


表明被注解的public void方法应该在测试方法的事务开始之前执行, 该事务是通过@Transactional注解来配置的。

 

@BeforeTransaction
public void beforeTransaction() {
    // logic to be executed before a transaction is started
}

 

@AfterTransaction

 

表明被注解的public void方法应该在测试方法的事务结束之后执行, 该事务是通过@Transactional注解来配置的。

 

@AfterTransaction
public void afterTransaction() {
    // logic to be executed after a transaction has ended
}

 

 

 

分享到:
评论

相关推荐

    springmvc5+hibernate5+junit4+log4j2整合实例

    在本整合实例中,我们将探讨如何将Spring MVC 5、Hibernate 5、JUnit 4 和 Log4j2 集成在一起,以构建一个高效、可测试和日志记录完善的Java Web应用程序。以下是对这些技术及其整合过程的详细说明: **Spring MVC ...

    Junit+log4j+slf4j

    "Junit+log4j+slf4j"这个组合涉及到的是Java编程领域的三个关键工具:JUnit用于进行单元测试,log4j是经典的日志记录库,而SLF4J(Simple Logging Facade for Java)则是一个日志抽象层。 JUnit是Java领域最广泛...

    SpringBoot第 3 讲:SpringBoot+Junit+Log4J

    在本讲中,我们将深入探讨如何在SpringBoot项目中整合JUnit测试框架以及Log4J日志系统。SpringBoot简化了Java应用的开发流程,而JUnit是广泛使用的单元测试工具,Log4J则是一款强大的日志记录框架。让我们一起了解...

    Hibernate4+SpringMVC+Junit4+log4j环境搭建Jar包

    这里我们关注的是基于Java技术栈的Web应用环境,具体包括Hibernate4、SpringMVC、JUnit4和log4j这四个核心组件。下面将详细介绍这些组件以及如何整合它们进行环境搭建。 **1. Hibernate4** Hibernate是一个开源的...

    hibernate+slf4j+log4j+junit包

    在Java开发领域,Hibernate、SLF4J、Log4j以及JUnit是四个非常重要的库,它们各自服务于不同的目的,但又常被一起使用以构建高效、可维护的项目。让我们来详细了解一下这些技术和它们在软件开发中的作用。 1. ...

    mybatis源码+练习代码+插件+log4j2+maven

    【标题】"mybatis源码+练习代码+插件+log4j2+maven" 提供的资源包是一个综合的学习资料集合,旨在帮助用户深入理解MyBatis这一流行持久层框架,同时涵盖日志管理工具Log4j2和项目构建工具Maven。以下是这些组件的...

    maven+spring+mybatis+mysql+junit jar项目框架搭建

    在IT行业中,构建一个高效的Java应用开发环境是至关重要的,而"Maven+Spring+MyBatis+MySQL+JUnit"的组合则是一个常见的选择。这个框架集合涵盖了项目构建、依赖管理、业务逻辑处理、数据库交互以及单元测试等多个...

    spring+springMVC+mybatis+maven+junit+mysql

    【标题】"spring+springMVC+mybatis+maven+junit+mysql" 是一个常见的Java Web项目技术栈,它涵盖了从后端开发到数据库管理,再到自动化构建和测试的完整流程。下面将详细阐述这些技术及其在项目中的作用。 ...

    ssm+log4j+JUnit(eclipse)

    SSM+Log4j+JUnit 是一个经典的Java Web开发组合,用于构建高效、可测试的后端服务。这里,我们来详细探讨这些组件以及如何在Eclipse环境下进行整合。 **Spring MVC (Spring Framework)**:Spring MVC是Spring框架的...

    ssm+log4j+JUnit+ajax

    SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试+ajax前后端分离。eclipse项目源码。传统web项目。多层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring....

    ssm五层架构+log4j+JUnit+通配

    SpringMvc+Spring+Mybatis+Log4j+JUnit单元测试。eclipse项目源码。传统web项目。五层架构(每层都使用包扫描或者通配的形式以简化开发时的配置量)。自配数据库地址,并修改查询语句即可用(spring.xml中的数据源)...

    Netbeans实现SpringMVC+Maven+Junit+Mybites+log4J+MySQL实现数据库增删改

    在本项目中,我们主要探讨了如何利用NetBeans IDE、SpringMVC、Maven、MyBatis、JUnit和Log4j这些技术栈来构建一个完整的Java Web应用,以实现对MySQL数据库的CRUD(创建、读取、更新、删除)操作。下面将详细解析每...

    spring+springmvc+mybatis+maven+junit整合

    【标题】"spring+springmvc+mybatis+maven+junit整合"是一个常见的Java Web开发框架集成,这个项目旨在为初学者提供一个基础的、可运行的示例,以理解这些技术如何协同工作。 【Spring框架】是核心的依赖注入(DI)...

    maven+springMVC+mybatis+velocity+mysql+junit项目框架搭建

    在构建企业级Web应用时,一个成熟的开发框架是至关重要的。本项目框架“maven+springMVC+mybatis+velocity+mysql+junit”提供了一种高效、灵活且可维护的解决方案。以下将详细讲解这些组件及其作用。 1. Maven: ...

    spring3_junit4.10_log4j

    标题 "spring3_junit4.10_log4j" 暗示了这是一个关于整合Spring 3.0框架、JUnit 4.10测试库以及Log4j日志框架的项目。描述中提到,Spring 3.0需要JUnit 4.5以上的版本,而JUnit 4.10在实际应用中表现良好,同时也...

    struts+hibernate+spring+xdoclet+ant+log4j

    Struts、Hibernate、Spring、XDoclet、Ant和Log4j是Java开发中常见的六个重要组件,它们在企业级应用开发中发挥着关键作用。这些技术的整合为开发者提供了高效、灵活和可维护的解决方案。 **Struts** 是一个基于MVC...

    SSH+mysql框架整合

    SSH+MySQL框架整合是Web开发中常见的技术栈,它结合了Struts2、Spring和Hibernate三个框架,以及MySQL数据库,构建出高效、稳定的后端架构。这篇文章将深入探讨这些技术的整合过程及其核心概念。 首先,Struts2是...

    最新版本的Struts2+Spring4+Hibernate4框架整合

    同时使用了Struts2、Spring4、Hibernate4、log4j、slf4j、junit4、ehcache等库或框架,搭建一个最基本的项目原型。 三、 三大框架最新版本下载:截止2014-10-01 Struts2.3.6:发布于2014-05-03,目前的最新版本。...

    Structs2+Spring+hibernate+jdom+junit+读取excel+serve2005+oracle+mysql 架包

    标题中的"Structs2+Spring+hibernate+jdom+junit+读取excel+serve2005+oracle+mysql 架包"涉及到一系列在Java开发中常用的框架和技术,这是一套集成的开发环境,可以帮助开发者快速搭建企业级应用。下面将对这些技术...

    Junit 单元测试完整案例

    本案例涵盖了Spring和Struts两大框架的单元测试,旨在帮助开发者掌握如何对这两个流行的Java Web框架进行有效的测试。 一、Junit基础 1. Junit简介:Junit是一款开源的、基于Java的测试框架,由Ernst Leifer和Kent...

Global site tag (gtag.js) - Google Analytics