免费设计logo的网站有哪些,扫码推广平台,免费做网站可以一直用吗,美橙网站设计shrinkwrap在Java EE 6测试的第一部分中#xff0c;我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API#xff0c;以演示如何启动该容器#xff0c;如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它… shrinkwrap 在Java EE 6测试的第一部分中我简要介绍了使用Glassfish嵌入式容器的EJB 3.1 Embeddable API以演示如何启动该容器如何在项目类路径中查找bean以及运行非常简单的集成测试。 这篇文章重点介绍Arquillian和ShrinkWrap以及为什么它们是用于企业Java应用程序集成测试的出色工具。 GitHub上的arquillian-shrinkwrap文件夹下提供了用于此文章的源代码。 工具 Arquillian Arquillian将测试执行带入目标运行时从而减轻了开发人员从测试或项目构建中管理运行时的负担。 为了反转此控件Arquillian将生命周期包装在执行以下操作的测试执行周围 管理一个或多个容器的生命周期 将测试用例相关类和资源捆绑为ShrinkWrap档案 将档案部署到容器 通过依赖注入和其他声明式服务丰富测试用例 在容器内部或针对容器执行测试 将结果返回给测试跑步者进行报告 收缩包装 ShrinkWrap是Arquillian的核心组件它提供了一种简单的机制可以通过友好流利的API来组合JARWAR和EAR等档案。 使用Arquillian的主要好处之一是您可以在远程容器即应用程序服务器中运行测试。 这意味着您将测试真实的交易 。 没有嘲笑。 甚至没有嵌入式运行时 议程 这篇文章将涵盖以下主题 在基于Maven的Java项目中配置Arquillian基础架构 直接在测试实例中注入EJB和托管BeanCDI 测试Java持久性APIJPA层 在客户端模式下运行Arquillian 在IDE中运行和调试Arquillian测试 配置Maven以运行集成测试 为了与Maven进行集成测试我们需要一种不同的方法。 通过不同的方法我的意思是不同的插件 Maven故障安全插件 。 故障安全插件是Maven Surefire插件的分支旨在运行集成测试。 Failsafe插件目标旨在在集成测试阶段的程序包阶段之后运行。 Maven生命周期有四个运行集成测试的阶段 集成前测试在此阶段我们可以启动任何所需的服务或执行任何操作例如启动数据库或启动Web服务器等等。 集成测试故障安全将在此阶段运行测试因此在所有必需的服务启动之后。 集成后测试关闭所有服务的时间… 验证 failsafe运行另一个在此处解释测试结果的目标如果没有通过任何测试failsafe将显示结果并退出构建。 在POM中配置故障保护 !-- clip --
plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-surefire-plugin/artifactIdversion2.12/versionconfigurationskipTeststrue/skipTests/configuration
/plugin
plugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-failsafe-plugin/artifactIdversion2.12/versionconfigurationencodingUTF-8/encoding/configurationexecutionsexecutionidintegration-test/idgoalsgoalintegration-test/goal/goals/executionexecutionidverify/idgoalsgoalverify/goal/goals/execution/executions
/plugin
!-- clip -- 默认情况下Surefire插件执行**/Test*.java **/*Test.java和**/*TestCase.java测试类。 Failsafe插件将查找**/IT*.java **/*IT.java和**/*ITCase.java 。 如果您同时使用Surefire和Failsafe插件请确保使用此命名约定以使其更容易识别哪个插件正在执行哪些测试。 在Maven中配置Arquillian基础架构 通过附加以下XML片段将Maven项目描述符配置为使用Arquillian !-- clip --
repositoriesrepositoryidjboss-public-repository-group/idnameJBoss Public Repository Group/nameurlhttp://repository.jboss.org/nexus/content/groups/public//url/repository
/repositoriesdependencyManagementdependenciesdependencygroupIdorg.jboss.arquillian/groupIdartifactIdarquillian-bom/artifactIdversion1.0.1.Final/versionscopeimport/scopetypepom/type/dependency/dependencies
/dependencyManagementdependenciesdependencygroupIdorg.jboss.arquillian.testng/groupIdartifactIdarquillian-testng-container/artifactIdscopetest/scope/dependencydependencygroupIdorg.testng/groupIdartifactIdtestng/artifactIdversion6.4/versionscopetest/scope/dependencydependencygroupIdorg.jboss.spec/groupIdartifactIdjboss-javaee-6.0/artifactIdversion3.0.1.Final/versionscopeprovided/scopetypepom/type/dependency
/dependenciesprofilesprofileidjbossas-remote-7/idactivationactiveByDefaulttrue/activeByDefault/activationdependenciesdependencygroupIdorg.jboss.as/groupIdartifactIdjboss-as-arquillian-container-remote/artifactIdversion7.1.1.Final/versionscopetest/scope/dependency/dependencies/profile
/profiles
!-- clip -- Arquillian有大量的容器适配器 。 Arquillian测试可以在与测试中使用的编程模型兼容的任何容器中执行。 但是在本文中仅使用JBoss AS 7。 与Java EE 6测试第1部分类似我选择使用TestNG测试框架但同样 JUnit应该也能正常工作。 创建可测试的组件 在研究如何使用Arquillian编写集成测试之前我们首先需要有一个要测试的组件。 会话Bean是Java EE堆栈中的常见组件将用作测试主题。 在本文中我将创建一个非常基本的后端用于向数据库中添加新用户。 Stateless
public class UserServiceBean {PersistenceContextprivate EntityManager em;public User addUser(User user) {em.persist(user);return user;}// Annotation says that we do not need to open a transactionTransactionAttribute(TransactionAttributeType.SUPPORTS)public User findUserById(Long id) {return em.find(User.class, id);}
} 在上面的代码中我使用JPA 因此我们需要一个持久性单元。 持久性单元定义由应用程序中的EntityManager实例管理的所有实体类的集合。 这组实体类表示单个数据存储中包含的数据。 持久性单元由persistence.xml配置文件定义 ?xml version1.0 encodingUTF-8?
persistence xmlnshttp://java.sun.com/xml/ns/persistencexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/persistencehttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsdversion2.0persistence-unit nameexamplejta-data-sourcejava:jboss/datasources/ExampleDS/jta-data-sourcepropertiesproperty namehibernate.hbm2ddl.auto valuecreate-drop /property namehibernate.show_sql valuetrue //properties/persistence-unit
/persistence 在此示例中我使用的示例数据源使用H2数据库并且已经使用JBoss AS 7进行了配置。 最后我们还需要一个映射到数据库中表的实体 Entity
public class User {IdGeneratedValueprivate Long id;NotNullprivate String name;// Removed constructors, getters and setters for brevityOverridepublic String toString() {return User [id id , name name ];}
} 使用Arquillian测试JPA 现在我们都准备编写我们的第一个Arquillian测试。 一个Arquillian测试用例看起来就像一个带有一些额外功能的单元测试。 它必须具有三件事 扩展Arquillian类这特定于TestNG对于JUnit您需要在类上使用RunWith(Arquillian.class)批注 用Deployment注释的公共静态方法该方法返回ShrinkWrap存档 至少一种使用Test注释的方法 public class UserServiceBeanIT extends Arquillian {private static final Logger LOGGER Logger.getLogger(UserServiceBeanIT.class.getName());Injectprivate UserServiceBean service;Deploymentpublic static JavaArchive createTestableDeployment() {final JavaArchive jar ShrinkWrap.create(JavaArchive.class, example.jar).addClasses(User.class, UserServiceBean.class).addAsManifestResource(META-INF/persistence.xml, persistence.xml)// Enable CDI.addAsManifestResource(EmptyAsset.INSTANCE, ArchivePaths.create(beans.xml));LOGGER.info(jar.toString(Formatters.VERBOSE));return jar;}Testpublic void callServiceToAddNewUserToDB() {final User user new User(Ike);service.addUser(user);assertNotNull(user.getId(), User id should not be null!);}
} 该测试很简单它插入一个新用户并检查id属性是否已被数据库生成的值填充。 由于Arquillian丰富了该测试因此您通常可以使用EJB或Inject批注来注入EJB和受管bean。 用Deployment注释的方法使用ShrinkWrap来构建一个JAR归档文件该归档文件将部署到容器中并对其进行测试。 ShrinkWrap将测试所需的类和资源与类路径的其余部分隔离开来您应该包括测试所需的每个组件才能在部署存档中运行。 客户端模式 Arquillian支持三种测试运行模式 容器内模式用于测试您的应用程序内部。 这使Arquillian能够与测试进行通信丰富测试并远程运行测试。 在这种模式下测试在远程容器中执行 Arquillian默认使用此模式。 客户端模式用于测试客户端如何使用您的应用程序。 与重新包装并覆盖测试执行的容器内模式相反客户端模式的作用尽可能小。 它不会重新打包Deployment也不会将测试执行转发到远程服务器。 您的测试用例正在JVM中按预期运行并且您可以自由地从外部测试容器如客户所见。 Arquillian唯一要做的就是控制Deployment的生命周期。 混合模式允许在同一测试类中混合两种运行模式。 要以客户端模式运行Arquillian首先要构建要测试的servlet WebServlet(/User)
public class UserServlet extends HttpServlet {private static final long serialVersionUID -7125652220750352874L;Injectprivate UserServiceBean service;Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.setContentType(text/plain);PrintWriter out response.getWriter();out.println(service.addUser(new User(Ike)).toString());out.close();}Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {doGet(request, response);}
} 现在让我们测试一下 public class UserServletIT extends Arquillian {private static final Logger LOGGER Logger.getLogger(UserServletIT.class.getName());// Not managed, should be used for external calls (e.g. HTTP)Deployment(testable false)public static WebArchive createNotTestableDeployment() {final WebArchive war ShrinkWrap.create(WebArchive.class, example.war).addClasses(User.class, UserServiceBean.class, UserServlet.class).addAsResource(META-INF/persistence.xml)// Enable CDI.addAsWebInfResource(EmptyAsset.INSTANCE, ArchivePaths.create(beans.xml));LOGGER.info(war.toString(Formatters.VERBOSE));return war;}RunAsClient // Same as Deployment(testable false), should only be used in mixed modeTest(dataProvider Arquillian.ARQUILLIAN_DATA_PROVIDER)public void callServletToAddNewUserToDB(ArquillianResource URL baseURL) throws IOException {// Servlet is listening at context_path/Userfinal URL url new URL(baseURL, User);final User user new User(1L, Ike);StringBuilder builder new StringBuilder();BufferedReader reader new BufferedReader(new InputStreamReader(url.openStream()));String line;while ((line reader.readLine()) ! null) {builder.append(line);}reader.close();assertEquals(builder.toString(), user.toString());}
} 尽管此测试非常简单但是它允许您使用单个方法调用来测试应用程序的多个层。 在Eclipse中运行测试 您可以从IDE内部运行Arquillian测试就像单元测试一样。 运行Arquillian测试 点击图片以放大 安装TestNG和JBoss Tools Eclipse插件。 将新的JBoss AS服务器添加到Eclipse 启动JBoss AS服务器 从Eclipse运行测试用例右键单击Project Explorer上的测试文件然后选择 Run As TestNG Test 结果应类似于以下内容 调试Arquillian测试 点击图片以放大 由于我们使用的是远程容器因此Debug As TestNG Test不会导致断点被激活。 相反我们需要以调试模式启动容器并附加调试器。 这是因为测试是在与原始测试运行器不同的JVM中运行的。 调试测试所需要做的唯一更改是在调试模式下启动JBoss AS服务器 启动JBoss AS服务器调试模式 将所需的断点添加到代码中。 并通过右键单击Project Explorer上的测试文件并选择它来调试它 Run As TestNG Test 更多资源 我希望能够强调Arquillian的一些好处。 有关Arquillian的更多信息请查看以下资源 Arquillian指南 Arquillian社区 Arquillian Git存储库 相关文章 单元测试JBoss 5服务 Java EE 6测试第I部分– EJB 3.1可嵌入API Maven 2 Cobertura插件–更新 JBoss PojoCache配置 JBoss AS 5.0已经发布 上一篇文章Java EE 6测试第I部分– EJB 3.1可嵌入API 下一篇文章比较OpenDDR与WURFL 参考 Java EE 6测试第二部分–来自我们JCG合作伙伴 Samuel Santos的Arquillian和ShrinkWrap简介位于Samaxes博客上。 翻译自: https://www.javacodegeeks.com/2012/06/java-ee-6-testing-part-ii-introduction.htmlshrinkwrap