借助Java 8 ,已实现了许多新的语言改进,以简化开发人员的生活。 在我看来, Java 8的最大优点之一是,在某些情况下,已开发的代码看起来比使用以前的方法更漂亮,我指的是Lambdas和Method引用。 这篇文章不是要学习这些Java 8功能,而是如何在Arquillian框架中应用它们。
我已经检测到四个用例,其中可以在Arquillian中使用方法引用和lambda。 在这里您可以看到它们,当然,如果您找到其他任何一个,请随时与我们分享。
要使用Arquillian编写测试,您需要以编程方式(jar,war或ear)创建部署文件。 这是使用Shrinkwrap完成的。 部署文件有时会要求您在其上添加一些外部依赖项。 典型示例是在创建WebArchive时 ,您需要向WEB-INF / lib中添加一些依赖项。 在这种情况下,这很容易,因为WebArchive类具有一个名为addAsLibraries的方法,该方法基本上将给定的jar添加到库路径中。
但是,当您的部署文件是jar文件时,会发生什么情况? 然后,您需要使用merge方法合并 JavaArchive对象内的每个库。
private static JavaArchive mergeHibernate(JavaArchive javaArchive) {JavaArchive[] javaArchives = Maven.resolver().resolve("org.hibernate:hibernate-entitymanager:4.2.15.Final").withTransitivity().as(JavaArchive.class);for(JavaArchive hibernateDep: javaArchives) {javaArchive.merge(hibernateDep);}return javaArchive;
}
这是一种方法,但是对于Java 8 ,可以使用foreach函数和方法引用 。
private static JavaArchive mergeHibernate(JavaArchive javaArchive) {JavaArchive[] javaArchives = Maven.resolver().resolve("org.hibernate:hibernate-entitymanager:4.2.15.Final").withTransitivity().as(JavaArchive.class);Arrays.stream(javaArchives).forEach(javaArchive::merge);return javaArchive;
}
请注意,我们正在将Array转换为流,因此我们可以调用foreach函数。 在ShrinkWrap Resolver的 2.2.0版本中,您将能够以List的形式获取依赖项,因此无需进行任何转换就可以获取流。 下一个重点是我们正在使用方法引用功能来合并所有依赖项。 现在只需一行我们就可以合并所有依赖项。
Arquillian使用ShrinkWrap创建部署文件并在其中添加资源。 通过使用API提供的任何方法(如add , addClass , addAsManifestReource等) 添加这些资源。 这些方法可以接收Asset作为第一个参数。 Asset是一个仅包含一个称为openStream的方法的接口,该方法返回InputStream 。 资产用于设置将添加到部署文件内部的文件的内容。
例如:
archive.add(new StringAsset("My txt file"), "hello.txt");
ShrinkWrap带有一些已经定义的资产,例如Url,String,Byte,Class等,但是有时您可能需要实现自己的Asset。
ShrinkWrap.create(JavaArchive.class).addAsManifestResource( new Asset() {public InputStream openStream() {return new CheckedInputStream(urlInputStream, crc32)}}, "persistence.xml");
在这种情况下,我们使用的是内部类,但是由于Asset类可以被视为功能接口(仅是一种抽象方法),因此我们可以使用Lambda来避免使用内部类。
非常简单,可读性强。
如果使用Arquillian Drone或Arquillian Graphene,将使用某些WebDriver Selenium类来获取网页元素。 有时,您需要验证HTML表的列,在这种情况下,您可能需要通过在列和行上迭代许多样板代码来验证包含正确值的样例代码。
Java 8之前的代码如下所示:
List<WebElement> elements = session.findElements(xpath("//table/tbody/tr/td/span[@class='title']"));List<String> columnValues = new ArrayList<String>();
for(WebElement webElement : elements) {columnValues.add(webElement.getText());
}return columnValues;
但是在Java 8中 ,通过添加流 API,代码变得更加容易和易读:
List<WebElement> elements = session.findElements(xpath("//table/tbody/tr/td/span[@class='title']"));
return elements.stream().map(WebElement::getText).collect(Collectors.toList());
如您所见,代码非常紧凑。 我们在这里要做的是首先获取列标题的所有Web元素,这里没有新闻。 但是随后流式 API开始发挥作用。 首先,我们通过调用stream方法从列表创建流 。 然后,我们正在从列表中存在的所有WebElement中调用方法getText 。 最后,返回实际上是列标题所有行的内容列表的字符串列表。
看到这种情况下的代码比以前的代码更具可读性,更重要的是,您甚至可以创建并行流来获得多核处理器的所有功能。
如您所见, Java 8不仅可以用于业务代码中,还可以用于测试中。
翻译自: https://www.javacodegeeks.com/2014/12/one-jar-to-rule-them-all-arquillian-java-8.html