一罐将其全部统治:Arquillian + Java 8
借助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
總結
以上是生活随笔為你收集整理的一罐将其全部统治:Arquillian + Java 8的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 查询文件linux(查询文件 linux
- 下一篇: (木村彩香ddos_061)