开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8开式蓄冷罐与闭式蓄冷罐借助Java8,已实现了许多新的语言改进,以简化开发人员的生活

开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian

开式蓄冷罐与闭式蓄冷罐

借助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​​提供的任何方法(如addaddClassaddAsManifestReource等) 添加这些资源。 这些方法可以接收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表格的列和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

开式蓄冷罐与闭式蓄冷罐

今天的文章开式蓄冷罐与闭式蓄冷罐_一罐将其全部统治:Arquillian + Java 8分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63812.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注