`

Spring3单元测试和集成测试

 
阅读更多
引用
本文针对常见的springmvc+spring+springjdbc的架构提供啦一些单元测试和集成测试的范例,附件是完整的demo



示例代码安装:
1 安装maven
2 准备mysql数据库,运行脚本: Spring3\schema\sampledb.sql
3 maven dbunit:export可以导出数据库数据到export.xml
4 maven test可以测试所有testing 代码
5 maven jetty:run 可以启动jetty服务器



1. maven pom 文件
<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.wilson</groupId>
	<artifactId>Spring3</artifactId>
	<packaging>war</packaging>
	<version>0.0.1-SNAPSHOT</version>
	<name>Spring3 Maven Webapp</name>
	<url>http://maven.apache.org</url>
	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.0.6.RELEASE</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>3.0.6.RELEASE</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.10</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>3.0.6.RELEASE</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>3.0.6.RELEASE</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>3.0-alpha-1</version>
			<type>jar</type>
			<scope>compile</scope>
		</dependency>
		<dependency>
			<groupId>commons-dbcp</groupId>
			<artifactId>commons-dbcp</artifactId>
			<version>1.4</version>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.17</version>
		</dependency>
		<dependency>
			<groupId>org.easymock</groupId>
			<artifactId>easymock</artifactId>
			<version>2.2</version>
		</dependency>
		<dependency>
			<groupId>dbunit</groupId>
			<artifactId>dbunit</artifactId>
			<version>2.2</version>
		</dependency>
	</dependencies>
	<build>
		<finalName>Spring3</finalName>
		<plugins>
			<plugin>
				<groupId>org.mortbay.jetty</groupId>
				<artifactId>jetty-maven-plugin</artifactId>
				<version>8.0.4.v20111024</version>
			</plugin>

			<plugin>
				<groupId>org.codehaus.mojo</groupId>
				<artifactId>dbunit-maven-plugin</artifactId>
				<version>1.0-beta-3</version>
				<dependencies>
					<dependency>
						<groupId>mysql</groupId>
						<artifactId>mysql-connector-java</artifactId>
						<version>5.1.17</version>
					</dependency>
				</dependencies>

				<configuration>
					<driver>com.mysql.jdbc.Driver</driver>
					<url>jdbc:mysql://localhost/sampledb</url>
					<username>root</username>
					<password>root</password>
					<type>CLEAN_INSERT</type>
					<!-- ataset file format type. Valid types are: flat, xml, csv, and dtd
							Default value is: xml. -->
					<format>xml</format>
					<src>src/test/resources/export.xml</src>
					<dest>src/test/resources/export.xml</dest>
				</configuration>

				<executions>
					<execution>
						<phase>process-test-classes</phase>
						<goals>
							<goal>operation</goal>
						</goals>
						<!-- specific configurations 我们可以在这里指定不同的配置-->
						<configuration>
							<format>xml</format>
							<src>src/test/resources/export.xml</src>
							<type>CLEAN_INSERT</type>
						</configuration>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>


2 测试spring mvc的controler

public class LoginControllerTest {
	
	@Test
	public void testingHandlerWithUserInSession() throws Exception {
		MockHttpServletRequest request = new MockHttpServletRequest();
//		LoginCommand command = new LoginCommand();
		MockHttpSession session = new MockHttpSession();
		session.setAttribute("user", new User());
		request.setSession(session);
		
		LoginController controller = new LoginController();
		ModelAndView mv1 = controller.handle(request, null, null, null);
		assertEquals(mv1.getViewName(), "target");
	}
}


3利用easymock对userService类做单元测试
public class UserServiceImplTest extends TestCase {
	public void testHasMatchUser() {
		System.out.println("teste1");
		UserServiceImpl s = new UserServiceImpl();
		UserDao dao = EasyMock.createMock(UserDao.class);
		s.setUserDao(dao);
		
		EasyMock.expect(dao.getMatchCount("tom", "1231")).andReturn(1);
		EasyMock.expect(dao.getMatchCount("tom", "234")).andReturn(0);
		
		EasyMock.replay(dao);
		
		assertEquals(s.hasMatchUser("tom", "1231"), true);
		assertEquals(s.hasMatchUser("tom", "234"), false);
		
	}
}



4 利用Dbunit对userDao做单元测试

  dbunit的测试数据
<?xml version='1.0' encoding='UTF-8'?>
<dataset>
	<table name="t_user">
    <column>user_id</column>
    <column>user_name</column>
    <column>credits</column>
    <column>password</column>
    <column>last_visit</column>
    <column>last_ip</column>
    <row>
      <value>3</value>
      <value>user001</value>
      <null/>
      <value>123456</value>
      <null/>
      <null/>
    </row>
  </table>
</dataset>


测试dao
package com.baobaotao.dao.jdbc;
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@ContextConfiguration(locations={"classpath:baobaotao-dao.xml","classpath:baobaotao-service.xml"})
public class UserDaoTest extends DBTestCase {
	public UserDaoTest() {
		 super();
		 System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_DRIVER_CLASS, "com.mysql.jdbc.Driver" );
	        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_CONNECTION_URL, "jdbc:mysql://localhost/sampledb" );
	        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_USERNAME, "root" );
	        System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_PASSWORD, "root" );
		// System.setProperty( PropertiesBasedJdbcDatabaseTester.DBUNIT_SCHEMA, "" );
	}

	@Resource
	private JdbcTemplate jdbcTemplate;

	@Autowired
	protected UserDao userDao;

	@Autowired
	private DataSource dataSource;

	private IDatabaseConnection conn;

	@Before
	public void initDbunit() throws Exception {
	   super.setUp();
	   conn = new DatabaseConnection(DataSourceUtils.getConnection(dataSource));
	}

//	@Test
	@Timed(millis=1000)
	public void testRegisterUser() throws SQLException, IOException, DatabaseUnitException, ParseException {
//		SimpleDateFormat dateFormatter = new SimpleDateFormat("dd.MM.yyyy");
		User user = new User();
		user.setUserId(3);
		user.setUserName("user001");
		user.setPassword("123456");
//		user.setCredits(40);
//		user.setLastIp("192.168.12.7");
//		user.setLastVisit(dateFormatter.parse("24.11.2011"));
		userDao.RegisterUser(user);

		QueryDataSet actual = new QueryDataSet(conn);
		actual.addTable("t_user",
				"select * from t_user where t_user.user_name = 'user001'");

		IDataSet expected = new XmlDataSet(new ClassPathResource("com/baobaotao/dao/jdbc/user001.xml").getInputStream());

		Assertion.assertEquals(expected, actual);
	}

	@Test
	@Transactional
	public void testCleanInsertInitial() {
		String sqlStr = " select count(*) from t_login_log where login_log_id = '9'";
		int count = jdbcTemplate.queryForInt(sqlStr);
		Assert.assertEquals(1, count);
	}

	@Override
	protected IDataSet getDataSet() throws Exception {
		return new XmlDataSet(new ClassPathResource("export.xml").getInputStream());
	}

}


5 利用spring的test包做集成测试
@RunWith(SpringJUnit4ClassRunner.class)
@Transactional
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
@ContextConfiguration(locations={"classpath:baobaotao-dao.xml","classpath:baobaotao-service.xml"})
public class UserServiceIntegrateWithJdbcTestSpring3 {
	@Resource
	private JdbcTemplate jdbcTemplate;

	@Autowired
	protected UserService userService;

	@Before
	public void prepareTestData() {
		System.out.println("before");
	}

	@Test
	@Timed(millis=1000)
	public void testRegisterUser() {
		User user = new User();
//		user.setUserId(2);
		user.setUserName("johnaaaa");
		user.setPassword("123456");
		userService.registerUser(user);

		String sqlStr = " select user_id from t_user where user_name = 'johnaaaa'";
		int userId = jdbcTemplate.queryForInt(sqlStr);
		Assert.assertEquals(userId, user.getUserId());
	}

	@Test
	public void testUserMatchService() {
		User user = new User();
//		user.setUserId(2);
		user.setUserName("wilson");
		user.setPassword("123456");
		userService.registerUser(user);

		Assert.assertFalse(userService.hasMatchUser("john11", "123456"));
		Assert.assertTrue(userService.hasMatchUser("wilson", "123456"));
	}

	//要求测试方法丢出异常
	@Test
	@ExpectedException(RuntimeException.class)
	public void testThrowException() {
		throw new RuntimeException("test");
	}

	@After
	public void after() {
		System.out.println("after");
	}
}


引用
分享到:
评论
1 楼 somefuture 2017-01-20  
     

相关推荐

    Spring Boot 单元测试和集成测试实现详解

    Spring Boot 单元测试和集成测试实现详解 Springs Boot 是一个基于 Java 的框架,提供了一个便捷的方式来开发基于 Spring 的应用程序。在开发过程中,测试是一个非常重要的步骤,单元测试和集成测试是其中的两种...

    07. Spring Boot单元测试

    总结,Spring Boot的单元测试涵盖多个层次,从简单的类方法测试到复杂的集成测试,都有相应的工具和策略。理解和熟练运用这些知识点,能有效提升开发效率,保证代码质量。在实际项目中,应根据需求选择合适的测试...

    最简单的含单元测试的spring boot+activiti集成demo

    这个集成演示项目旨在帮助开发者快速理解和实现基于Spring Boot的Activiti工作流应用,同时包含了单元测试以确保代码质量。 **Spring Boot** Spring Boot是Spring框架的扩展,它简化了创建独立、生产级别的基于...

    spring+Junit4单元测试

    通过Spring集成单元测试,以后测试service层内容时,就不用getBean()来获得Service层对象了

    spring整合单元测试Junit开发包

    6. **Integration测试**: `@WebAppConfiguration`和`@SpringBootTest`注解可用于集成测试,它们会启动一个完整的Spring Web应用上下文,让你可以测试服务、控制器以及它们之间的交互。 7. **Transactional测试**: `...

    spring集成TestNG与Mockito框架单元测试方法.pdf

    Spring集成TestNG与Mockito框架单元测试方法的文档详细介绍了如何在Java Spring项目中,利用TestNG和Mockito框架进行单元测试。这种测试方法可以帮助开发者快速上手单元测试,并确保代码质量。文档涉及了多个方面,...

    spring mvc jpa单元测试例子

    在Spring MVC和JPA的开发过程中,单元测试是不可或缺的一部分,它可以帮助我们验证代码的正确性,确保系统各个部分能够按预期工作。本例子聚焦于使用Spring的Test注解进行事务管理的单元测试,这对于数据库操作尤其...

    spring集成测试工具的详细讲解

    Spring提供了一些工具和库,如Spring Test、Spring Boot Test和Mockito,来帮助开发者有效地进行集成测试。 1. Spring Test:这是Spring框架自带的测试模块,它提供了`@RunWith(SpringRunner.class)`注解,使得...

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

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

    spring MVC junit 单元测试(controller)

    在Spring MVC框架中,单元测试是确保代码质量的重要步骤,特别是在控制器层(Controller)。...在实际操作时,参考博客中的示例代码和上述步骤,可以更好地理解和实践Spring MVC Controller的单元测试。

    Spring对于业务层的单元测试支持

    其中,Spring对于业务层的单元测试和集成测试提供了丰富的工具和功能,使得开发者能够更加高效地对代码进行验证和调试。本文将深入探讨Spring如何帮助我们进行业务层的测试。 首先,单元测试主要关注的是单个类或...

    Spring2集成测试

    当我们谈论“Spring2集成测试”,我们指的是利用Spring框架提供的工具和最佳实践来测试整个应用程序的集成部分,确保各个组件协同工作。 集成测试是软件开发过程中的关键步骤,它位于单元测试之后,系统测试之前,...

    spring单元测试

    接下来,我们关注Spring单元测试的实施。在Spring中,我们可以使用`@RunWith(SpringRunner.class)`和`@SpringBootTest`注解来启动一个完整的Spring应用上下文,以便测试Controller层。例如,对于一个名为`...

    Spring Boot中的单元测试.pdf

    Spring Boot为此提供了一系列便利工具和依赖,使得设置和执行单元测试变得简单。 首先,要开始在Spring Boot项目中进行单元测试,你需要引入`spring-boot-starter-test`依赖。这个起步依赖包含了多个测试相关的库,...

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

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

    主题:在Spring中结合Dbunit对Dao进行集成单元测试

    在Spring框架中,进行Dao层的集成单元测试时,常常会结合Dbunit工具来实现数据库相关的测试。Dbunit是一款强大的Java库,它扩展了JUnit,为数据库提供了结构化数据的导入和导出,使得测试更加方便和可靠。下面将详细...

Global site tag (gtag.js) - Google Analytics