域名注册完成后怎么做网站,什么网站做海报赚钱,中英文切换网站开发,做网站域名公司很长时间以来#xff0c;我听到很多人对Arquillian说好话 。 虽然我一直在阅读有关其用法的文章#xff0c;但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然#xff0c;我看起来还不够努力。 我要讲的要点是#xff1a; 使用JPA。 我只是在这里使用… 很长时间以来我听到很多人对Arquillian说好话 。 虽然我一直在阅读有关其用法的文章但实际上我无法在一篇文章中找到涵盖我认为重要的某些方面的文章。 当然我看起来还不够努力。 我要讲的要点是 使用JPA。 我只是在这里使用EclipseLink 使用内存数据库 使用CDI注射 EJB的使用例如本地无状态会话Bean 使用JSR-303 Bean验证 使用嵌入式玻璃鱼进行集成测试。 我花了一些时间来收集信息以启动并运行该项目。 我以为我专门写这篇文章来帮助那些有类似要求的人。 那么我们还在等什么 开始吧 配置pom.xml 当然我们需要配置项目以使用Arquillian还需要使用EclipseLink作为持久性提供程序。 但是请记住我们还要在决定使用内存数据库之前就做出决定。 您可能希望在此pom.xml中包括您的依赖项。 但是我决定使用Derby它在标准Oracle Java SDK类路径中可用。 无论如何所以pom.xml看起来像这样 ?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentartifactIdinout/artifactIdgroupIdid.co.dwuysan/groupIdversion1.0-SNAPSHOT/version/parentgroupIdid.co.dwuysan/groupIdartifactIdinout-ejb/artifactIdversion1.0-SNAPSHOT/versionpackagingejb/packagingnameinout-ejb/namepropertiesendorsed.dir${project.build.directory}/endorsed/endorsed.dirproject.build.sourceEncodingUTF-8/project.build.sourceEncodingnetbeans.hint.deploy.servergfv3ee6/netbeans.hint.deploy.server/propertiesdependencyManagementdependenciesdependencygroupIdorg.jboss.arquillian/groupIdartifactIdarquillian-bom/artifactIdversion1.0.0.Final/versionscopeimport/scopetypepom/type/dependency/dependencies/dependencyManagementdependenciesdependencygroupIdorg.eclipse.persistence/groupIdartifactIdeclipselink/artifactIdversion2.3.2/versionscopeprovided/scope/dependencydependencygroupIdorg.eclipse.persistence/groupIdartifactIdjavax.persistence/artifactIdversion2.0.3/versionscopeprovided/scope/dependencydependencygroupIdorg.eclipse.persistence/groupIdartifactIdorg.eclipse.persistence.jpa.modelgen.processor/artifactIdversion2.3.2/versionscopeprovided/scope/dependency!-- test --dependencygroupIdorg.jboss.arquillian/groupIdartifactIdarquillian-bom/artifactIdversion1.0.3.Final/versiontypepom/type/dependencydependencygroupIdorg.glassfish.main.extras/groupIdartifactIdglassfish-embedded-all/artifactIdversion3.1.2.2/versionscopeprovided/scope/dependencydependencygroupIdorg.jboss.arquillian.container/groupIdartifactIdarquillian-glassfish-embedded-3.1/artifactIdversion1.0.0.CR3/versionscopetest/scope/dependencydependencygroupIdorg.jboss.arquillian.junit/groupIdartifactIdarquillian-junit-container/artifactIdscopetest/scope/dependencydependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.11/versionscopetest/scope/dependency!-- environment requirement --dependencygroupIdjavax/groupIdartifactIdjavaee-api/artifactIdversion6.0/versionscopeprovided/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-surefire-plugin/artifactIdversion2.12.4/versionconfigurationargLine-XX:-UseSplitVerifier/argLinesystempropertyvariablesjava.util.logging.config.file${basedir}/src/test/resources/logging.properties/java.util.logging.config.file/systempropertyvariablessystemPropertiespropertynamederby.stream.error.file/namevaluetarget/derby.log/value/property/systemProperties/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-compiler-plugin/artifactIdversion2.3.2/versionconfigurationsource1.7/sourcetarget1.7/targetcompilerArgumentsendorseddirs${endorsed.dir}/endorseddirs/compilerArgumentsshowDeprecationtrue/showDeprecation/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-ejb-plugin/artifactIdversion2.3/versionconfigurationejbVersion3.1/ejbVersion/configuration/pluginplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-dependency-plugin/artifactIdversion2.1/versionexecutionsexecutionphasevalidate/phasegoalsgoalcopy/goal/goalsconfigurationoutputDirectory${endorsed.dir}/outputDirectorysilenttrue/silentartifactItemsartifactItemgroupIdjavax/groupIdartifactIdjavaee-endorsed-api/artifactIdversion6.0/versiontypejar/type/artifactItem/artifactItems/configuration/execution/executions/plugin/plugins/buildrepositoriesrepositoryidjava.net/idurlhttp://download.java.net/maven//url/repositoryrepositoryidJBOSS_NEXUS/idurlhttp://repository.jboss.org/nexus/content/groups/public/url/repositoryrepositoryurlhttp://download.eclipse.org/rt/eclipselink/maven.repo//urlideclipselink/idlayoutdefault/layoutnameRepository for library EclipseLink (JPA 2.0)/name/repository/repositories
/project 如上面的XML所示我们所做的事情是 包括使用Arquillian使用嵌入式Glassfish 包括使用EclipseLink 设置Derby道具以备后用即记录和创建数据库的位置。 创建“案例”即我们的JPAEJBCDI 当然我们首先要创建一个案例以便以后进行测试。 我假设您熟悉JPAEJBCDI。 因此下面是使用这些技术的类的快速概览。 JPA类Outlet.java package id.co.dwuysan.inout.entity;// imports omittedEntity
NamedQueries({NamedQuery(name Outlet.FIND_BY_NAME,query SELECT o FROM Outlet o WHERE o.name :name)
})
public class Outlet implements Serializable {public static final String FIND_BY_NAME Outlet#FIND_BY_NAME;IdGeneratedValue(strategy GenerationType.AUTO)private Long id;Column(name code, length 50, insertable true, updatable false, unique true)Size(message {dwuysan.nameSizeError}, min 1, max 50)NotNullprivate String name;/* Accessors and mutators goes here */Overridepublic int hashCode() {// omitted}Overridepublic boolean equals(Object obj) {// omitted}
} Persistence.xml ?xml version1.0 encodingUTF-8?
persistence version2.0 xmlnshttp://java.sun.com/xml/ns/persistencexmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsdpersistence-unit nameinoutPU transaction-typeJTAproviderorg.eclipse.persistence.jpa.PersistenceProvider/providerjta-data-sourceinoutDb/jta-data-sourceexclude-unlisted-classesfalse/exclude-unlisted-classespropertiesproperty nameeclipselink.ddl-generation valuedrop-and-create-tables//properties/persistence-unit
/persistence 然后我们添加一个生产者方法来提供我们的PersistenceContext以及使用它的EJB。 EntityManagerProducer.java package id.co.dwuysan.inout.util;import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;public class EntityManagerProducer {ProducesPersistenceContextprivate EntityManager em;
} OutletService.java package id.co.dwuysan.inout.service;// imports omittedStateless
LocalBean
public class OutletService {Injectprivate EntityManager em;Resourceprivate Validator validator;public Outlet createOutlet(final String name) {final Outlet outlet new Outlet();outlet.setName(name);final SetConstraintViolationOutlet violations this.validator.validate(outlet);if (!violations.isEmpty()) { throw new ConstraintViolationException(new HashSetConstraintViolation?(violations)); }return this.em.merge(outlet);}public Outlet getOutlet(final String name) {final Query query this.em.createNamedQuery(Outlet.FIND_BY_NAME);query.setParameter(name, name);try {return (Outlet) query.getSingleResult();} catch (NoResultException e) {return null;}}
} 设置beans.xml和ValidationMessages.properties 不要忘记 在src / main / resources / META-INF下添加beans.xml 并 在src / main / resources下添加ValidationMessages.properties 并 dwuysan.nameSizeError error message you like here配置您的消息dwuysan.nameSizeError error message you like here 配置用于测试目的 在这一点上如果您部署它应该可以工作。 但是这不是我们的目标。 我们希望使用嵌入式Glassfish使它在Arquillian下工作。 首先让我们使用Derby数据库准备嵌入式玻璃鱼的配置。 该文件是glassfish-resources.xml 。 就我而言我只是将该文件放在一个新目录下主要用于分离即src/test/resources-glassfish-embedded/glassfish-resources.xml 。 glassfish-resources.xml ?xml version1.0 encodingUTF-8?
!DOCTYPE resources PUBLIC-//GlassFish.org//DTD GlassFish Application Server 3.1 Resource Definitions//ENhttp://glassfish.org/dtds/glassfish-resources_1_5.dtd
resourcesjdbc-resource pool-nameArquillianEmbeddedDerbyPooljndi-namejdbc/arquillian/jdbc-connection-pool nameArquillianEmbeddedDerbyPoolres-typejavax.sql.DataSourcedatasource-classnameorg.apache.derby.jdbc.EmbeddedDataSourceis-isolation-level-guaranteedfalseproperty namedatabaseName valuetarget/databases/derby/property namecreateDatabase valuecreate//jdbc-connection-pool
/resources 这是不言自明的。 只需记住将数据库配置为在target/databases/derby上创建以便在执行mvn clean时将对其进行清理。 下一步是配置Arquillian以“识别”此glassfish-resources.xml 。 为此请在src/test/resources目录下添加arquillian.xml 。 glassfish-resources.xml ?xml version1.0 encodingUTF-8?
arquillian xmlnshttp://jboss.org/schema/arquillianxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://jboss.org/schema/arquillian http://jboss.org/schema/arquillian/arquillian_1_0.xsdengineproperty namedeploymentExportPathtarget/arquillian/property/engine container defaulttrue qualifierglassfishconfigurationproperty nameresourcesXmlsrc/test/resources-glassfish-embedded/glassfish-resources.xml/property/configuration/container
/arquillian 下一步是准备我们的persistence.xml 。 我们已经有一个了但是请记住我们需要提供一个在内存中的并利用我们的嵌入式Glassfish提供的jdbc连接请参阅上面的glassfish-resources.xml 该文件在以下目录中提供了jdbc-resource-pool 。 JNDI名称为jdbc/arquillian 在我的情况下我将此名称为test-persistence.xml命名为src/test/resources test-persistence.xml ?xml version1.0 encodingUTF-8?
persistence version2.0 xmlnshttp://java.sun.com/xml/ns/persistence xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xsi:schemaLocationhttp://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsdpersistence-unit nameinoutPU transaction-typeJTAproviderorg.eclipse.persistence.jpa.PersistenceProvider/providerjta-data-sourcejdbc/arquillian/jta-data-sourceexclude-unlisted-classesfalse/exclude-unlisted-classesshared-cache-modeALL/shared-cache-modepropertiesproperty namejavax.persistence.jdbc.driver valueorg.apache.derby.jdbc.EmbeddedDriver /property namejavax.persistence.jdbc.url valuejdbc:derby:target/databases/derby;createtrue /property nameeclipselink.ddl-generation valuedrop-and-create-tables /property nameeclipselink.target-database valueDerby/property nameeclipselink.ddl-generation valuedrop-and-create-tables/property nameeclipselink.debug valueOFF/property nameeclipselink.weaving valuestatic/!--property nameeclipselink.logging.level valueFINEST/--property nameeclipselink.logging.level.sql valueFINE/property nameeclipselink.logging.parameters valuetrue/!--property nameeclipselink.logging.level.cache valueFINEST/--property nameeclipselink.logging.logger valueDefaultLogger//properties/persistence-unit
/persistence 一切准备就绪后我们现在就可以与Arquillian一起编写单元测试了。 在这种情况下最好测试我们的服务EJB因为这是我们将使用JPACDI和Validation的地方。 OutletServiceTest.java package id.co.dwuysan.inout.service;// imports omittedRunWith(Arquillian.class)
public class OutletServiceTest { Injectprivate OutletService outletService;Deploymentpublic static JavaArchive createTestArchive() {return ShrinkWrap.create(JavaArchive.class).addClass(Outlet.class).addClass(OutletService.class).addClass(EntityManagerProducer.class).addAsManifestResource(test-persistence.xml,ArchivePaths.create(persistence.xml)).addAsManifestResource(META-INF/beans.xml,ArchivePaths.create(beans.xml)).addAsResource(ValidationMessages.properties);}Testpublic void testCreateOutlet() throws Exception {final String outletName Outlet 001;final Outlet outlet this.outletService.createOutlet(outletName);Assert.assertNotNull(outlet);// check retrievalfinal Outlet retrievedOutlet this.outletService.getOutlet(outletName);Assert.assertEquals(outlet.getName(), retrievedOutlet.getName());}Test(expected ConstraintViolationException.class)public void testCreateOutletWithEmptyName() throws Exception {try {final Outlet outlet this.outletService.createOutlet();} catch (EJBException e) { final ConstraintViolationException cve (ConstraintViolationException) e.getCause();Assert.assertEquals(Total error message should only be one,1, cve.getConstraintViolations().size()); Assert.assertEquals(Message must be correct,Name must be provided,cve.getConstraintViolations().iterator().next().getMessage());throw cve;}}
} 在上面的示例中第一个测试是测试成功的案例。 给定名称检索将导致提供与参数相同名称的Outlet实体返回。 但是在表面之下如果我们回顾OutletService.java的主体我们实际上正在测试 持久性JPA进入基础Derby EJB注入此测试/ li 通过Producer方法CDI注入的PersistenceContext 测试没有违反验证 测试我们的NamedQuery 第二项测试旨在测试消息是否正确内插。 参考前面提到的内容对于我的错误消息我将以下条目放入ValidationMessages.properties dwuysan.nameSizeErrorName must be provided 因此我们需要测试“ Outlet Bean验证”消息是否正确内插。 请注意第二项测试。 注意首先我们正在捕获EJBException 。 那是因为在EJB中抛出的任何运行时异常都将被包装到EJBException 因此需要通过#getCause()提取它。 所以你去了。 现在您可以添加更多服务并开始Arquillian测试。 快乐编码 未来调查 当然许多Java EE应用程序都需要认证和授权这通常是通过JAAS完成的。 例如使用上面的简单示例假设要修改服务以检索当前用户可以访问的出口那么我们当然需要获取当前用户的身份。 通常这是通过EJBContext.getCallerPrincipal() . I wonder how we can do this using Arquillian and embedded Glassfish. EJBContext.getCallerPrincipal() . I wonder how we can do this using Arquillian and embedded Glassfish. 参考在dwuysan博客博客上我们的JCG合作伙伴 Deny Wuysan 使用Arquillian包括JPAEJBBean验证和CDI测试了Java EE 6 。 翻译自: https://www.javacodegeeks.com/2013/09/testing-java-ee-6-with-arquillian-incl-jpa-ejb-bean-validation-and-cdi.html