弹簧测试支持涵盖了基于弹簧的应用程序的单元和集成测试的非常有用和重要的功能。 org.springframework.test.context.testng包为基于TestNG的测试用例提供支持类。 本文展示了如何通过使用Spring和TestNG集成来测试Spring Service层组件。 下一篇文章还将展示如何使用相同的集成来测试Spring Data Access层组件。
二手技术:
JDK 1.6.0_31
春天3.1.1
测试NG 6.4 Maven的3.0.2
步骤1:建立已完成的专案
如下创建一个Maven项目。 (可以使用Maven或IDE插件来创建它)。
步骤2:图书馆
Spring依赖项已添加到Maven的pom.xml中。
<properties><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><!-- Spring 3 dependencies --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><!-- TestNG dependency --><dependency><groupId>org.testng</groupId><artifactId>testng</artifactId><version>6.4</version></dependency><!-- Log4j dependency --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.16</version></dependency></dependencies>
步骤3:建立使用者类别
创建一个新的用户类。
package com.otv.user;/*** User Bean** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public class User {private String id;private String name;private String surname;/*** Gets User Id** @return String id*/public String getId() {return id;}/*** Sets User Id** @param String id*/public void setId(String id) {this.id = id;}/*** Gets User Name** @return String name*/public String getName() {return name;}/*** Sets User Name** @param String name*/public void setName(String name) {this.name = name;}/*** Gets User Surname** @return String Surname*/public String getSurname() {return surname;}/*** Sets User Surname** @param String surname*/public void setSurname(String surname) {this.surname = surname;}@Overridepublic String toString() {StringBuilder strBuilder = new StringBuilder();strBuilder.append("Id : ").append(getId());strBuilder.append(", Name : ").append(getName());strBuilder.append(", Surname : ").append(getSurname());return strBuilder.toString();}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + ((id == null) ? 0 : id.hashCode());result = prime * result + ((name == null) ? 0 : name.hashCode());result = prime * result + ((surname == null) ? 0 : surname.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;User other = (User) obj;if (id == null) {if (other.id != null)return false;} else if (!id.equals(other.id))return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;if (surname == null) {if (other.surname != null)return false;} else if (!surname.equals(other.surname))return false;return true;}
}
步骤4:创建NonExistentUserException类
NonExistentUserException类已创建。
package com.otv.common.exceptions;/*** Non Existent User Exception** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public class NonExistentUserException extends Exception {private static final long serialVersionUID = 1L;public NonExistentUserException(String message) {super(message);}
}
第5步:创建ICacheService接口
创建了代表缓存服务接口的ICacheService接口。
package com.otv.cache.service;import java.util.concurrent.ConcurrentHashMap;import com.otv.user.User;/*** Cache Service Interface** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public interface ICacheService {/*** Gets User Map** @return ConcurrentHashMap User Map*/ConcurrentHashMap<String, User> getUserMap();}
步骤6:创建CacheService类
CacheService类是通过实现ICacheService接口创建的。 它提供对远程缓存的访问…
package com.otv.cache.service;import java.util.concurrent.ConcurrentHashMap;import com.otv.user.User;/*** Cache Service Implementation** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public class CacheService implements ICacheService {//User Map is injected...private ConcurrentHashMap<String, User> userMap;/*** Gets User Map** @return ConcurrentHashMap User Map*/public ConcurrentHashMap<String, User> getUserMap() {return userMap;}/*** Sets User Map** @param ConcurrentHashMap User Map*/public void setUserMap(ConcurrentHashMap<String, User> userMap) {this.userMap = userMap;}}
步骤7:建立IUserService介面
创建了代表用户服务接口的IUserService接口。
package com.otv.user.service;import java.util.Collection;import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;/**** User Service Interface** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public interface IUserService {/*** Adds User** @param User user* @return boolean whether delete operation is success or not.*/boolean addUser(User user);/*** Deletes User** @param User user* @return boolean whether delete operation is success or not.*/boolean deleteUser(User user);/*** Updates User** @param User user* @throws NonExistentUserException*/void updateUser(User user) throws NonExistentUserException;/*** Gets User** @param String User Id* @return User*/User getUserById(String id);/*** Gets User Collection** @return List - User list*/Collection<User> getUsers();
}
步骤8:创建UserService类
通过实现IUserService接口创建UserService类。
package com.otv.user.service;import java.util.Collection;
import com.otv.cache.service.ICacheService;
import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;/**** User Service** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
public class UserService implements IUserService {//CacheService is injected...private ICacheService cacheService;/*** Adds User** @param User user* @return boolean whether delete operation is success or not.*/public boolean addUser(User user) {getCacheService().getUserMap().put(user.getId(), user);if(getCacheService().getUserMap().get(user.getId()).equals(user)) {return true;}return false;}/*** Deletes User** @param User user* @return boolean whether delete operation is success or not.*/public boolean deleteUser(User user) {User removedUser = getCacheService().getUserMap().remove(user.getId());if(removedUser != null) {return true;}return false;}/*** Updates User** @param User user* @throws NonExistentUserException*/public void updateUser(User user) throws NonExistentUserException {if(getCacheService().getUserMap().containsKey(user.getId())) {getCacheService().getUserMap().put(user.getId(), user);} else {throw new NonExistentUserException("Non Existent User can not update! User : "+user);}}/*** Gets User** @param String User Id* @return User*/public User getUserById(String id) {return getCacheService().getUserMap().get(id);}/*** Gets User List** @return Collection - Collection of Users*/public Collection<User> getUsers() {return (Collection<User>) getCacheService().getUserMap().values();}/*** Gets Cache Service** @return ICacheService - Cache Service*/public ICacheService getCacheService() {return cacheService;}/*** Sets Cache Service** @param ICacheService - Cache Service*/public void setCacheService(ICacheService cacheService) {this.cacheService = cacheService;}}
步骤9:创建UserServiceTester类
通过扩展AbstractTestNGSpringContextTests创建用户服务测试器类。
package com.otv.user.service.test;import junit.framework.Assert;import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
import org.testng.annotations.AfterClass;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;import com.otv.common.exceptions.NonExistentUserException;
import com.otv.user.User;
import com.otv.user.service.IUserService;/*** User Service Tester Class** @author onlinetechvision.com* @since 19 May 2012* @version 1.0.0**/
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
public class UserServiceTester extends AbstractTestNGSpringContextTests {private static Logger logger = Logger.getLogger(UserServiceTester.class);@Autowiredprivate IUserService userService;private User firstUser;private User secondUser;private User thirdUser;/*** Creates Test Users**/private void createUsers() {firstUser = new User();firstUser.setId("1");firstUser.setName("Lionel");firstUser.setSurname("Messi");secondUser = new User();secondUser.setId("2");secondUser.setName("David");secondUser.setSurname("Villa");thirdUser = new User();thirdUser.setId("3");thirdUser.setName("Andres");thirdUser.setSurname("Iniesta");}/*** Asserts that User Properties are not null.** @param User*/private void assertNotNullUserProperties(User user) {Assert.assertNotNull("User must not be null!", user);Assert.assertNotNull("Id must not be null!", user.getId());Assert.assertNotNull("Name must not be null!", user.getName());Assert.assertNotNull("Surname must not be null!", user.getSurname());}/*** The annotated method will be run before any test method belonging to the classes* inside the <test> tag is run.**/@BeforeTestpublic void beforeTest() {logger.debug("BeforeTest method is run...");}/*** The annotated method will be run before the first test method in the current class* is invoked.**/@BeforeClasspublic void beforeClass() {logger.debug("BeforeClass method is run...");createUsers();}/*** The annotated method will be run before each test method.**/@BeforeMethodpublic void beforeMethod() {logger.debug("BeforeMethod method is run...");} /*** Tests the process of adding user**/@Testpublic void addUser() {assertNotNullUserProperties(firstUser);Assert.assertTrue("User can not be added! User : " + firstUser, getUserService().addUser(firstUser));}/*** Tests the process of querying user**/@Testpublic void getUserById() {User tempUser = getUserService().getUserById(firstUser.getId());assertNotNullUserProperties(tempUser);Assert.assertEquals("Id is wrong!", "1", tempUser.getId());Assert.assertEquals("Name is wrong!", "Lionel", tempUser.getName());Assert.assertEquals("Surname is wrong!", "Messi", tempUser.getSurname());}/*** Tests the process of deleting user**/@Testpublic void deleteUser() {assertNotNullUserProperties(secondUser);Assert.assertTrue("User can not be added! User : " + secondUser, getUserService().addUser(secondUser));Assert.assertTrue("User can not be deleted! User : " + secondUser, getUserService().deleteUser(secondUser));}/*** Tests the process of updating user* @throws NonExistentUserException**/@Test(expectedExceptions = NonExistentUserException.class)public void updateUser() throws NonExistentUserException {getUserService().updateUser(thirdUser);}/*** Test user count**/@Testpublic void getUserCount() {Assert.assertEquals(1, getUserService().getUsers().size());}/*** The annotated method will be run after all the test methods in the current class have been run.**/@AfterClasspublic void afterClass() {logger.debug("AfterClass method is run...");}/*** The annotated method will be run after all the test methods belonging to the classes inside the <test> tag have run.**/@AfterTestpublic void afterTest() {logger.debug("AfterTest method is run...");}/*** The annotated method will be run after each test method.**/@AfterMethodpublic void afterMethod() {logger.debug("AfterMethod method is run...");}/*** Gets User Service** @return IUserService User Service*/public IUserService getUserService() {return userService;}/*** Sets User Service** @param IUserService User Service*/public void setUserService(IUserService userService) {this.userService = userService;}}
步骤10:创建applicationContext.xml
应用程序上下文的创建如下:
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsd"><!-- User Map Declaration --><bean id="UserMap" class="java.util.concurrent.ConcurrentHashMap" /><!-- Cache Service Declaration --><bean id="CacheService" class="com.otv.cache.service.CacheService"><property name="userMap" ref="UserMap"/></bean><!-- User Service Declaration --><bean id="UserService" class="com.otv.user.service.UserService"><property name="cacheService" ref="CacheService"/></bean>
</beans>
步骤11:运行项目
在本文中,已使用TestNG Eclipse插件。 如果使用Eclipse,则可以通过TestNG下载页面下载它
如果运行UserServiceTester ,则测试用例的结果如下所示:
步骤12:下载
OTV_SpringTestNG
参考资料:
Spring测试支持
TestNG参考
参考: Online Technology Vision博客中的JCG合作伙伴 Eren Avsarogullari 提供的TestNG的Spring测试支持 。
翻译自: https://www.javacodegeeks.com/2012/05/spring-testing-support-with-testng.html