mvn編寫主代碼與測試代碼

maven編寫主代碼與測試代碼

3.2 編寫主代碼?

?

項目主代碼和測試代碼不同,項目的主代碼會被打包到最終的構件中(比如jar),而測試代碼只在運行測試時用到,不會被打包。默認情況下,Maven假設項目主代碼位于src/main/java目錄,我們遵循Maven的約定,創建該目錄,然后在該目錄下創建文件com/juvenxu/mvnbook/helloworld/HelloWorld.java,其內容如代碼清單3-2:

代碼清單3-2:Hello World的主代碼

Java代碼??收藏代碼
  1. <span?style="font-size:?small;">package?com.juvenxu.mvnbook.helloworld;??
  2. ???
  3. public?class?HelloWorld??
  4. {??
  5. ???public?String?sayHello()??
  6. ???{??
  7. ?????return?"Hello?Maven";??
  8. ???}??
  9. ??
  10. ??public?static?void?main(String[]?args)??
  11. ???{??
  12. ?????System.out.print(?new?HelloWorld().sayHello()?);??
  13. ???}??
  14. }??
  15. </span>??

???????這是一個簡單的Java類,它有一個sayHello()方法,返回一個String。同時這個類還帶有一個main方法,創建一個HelloWorld實例,調用sayHello()方法,并將結果輸出到控制臺。

關于該Java代碼有兩點需要注意。首先,在95%以上的情況下,我們應該把項目主代碼放到src/main/java/目錄下(遵循Maven的約定),而無須額外的配置,Maven會自動搜尋該目錄找到項目主代碼。其次,該Java類的包名是com.juvenxu.mvnbook.helloworld,這與我們之前在POM中定義的groupId和artifactId相吻合。一般來說,項目中Java類的包都應該基于項目的groupId和artifactId,這樣更加清晰,更加符合邏輯,也方便搜索構件或者Java類。

代碼編寫完畢后,我們使用Maven進行編譯,在項目根目錄下運行命令?mvn clean compile?,我們會得到如下輸出:

?

Java代碼??收藏代碼
  1. <span?style="font-size:?small;">[INFO]?Scanning?for?projects...??
  2. [INFO]?------------------------------------------------------------------------??
  3. [INFO]?Building?Maven?Hello?World?Project??
  4. [INFO]????task-segment:?[clean,?compile]??
  5. [INFO]?------------------------------------------------------------------------??
  6. [INFO]?[clean:clean?{execution:?default-clean}]??
  7. [INFO]?Deleting?directory?D:\code\hello-world\target??
  8. [INFO]?[resources:resources?{execution:?default-resources}]??
  9. [INFO]?skip?non?existing?resourceDirectory?D:?\code\hello-world\src\main\resources??
  10. [INFO]?[compiler:compile?{execution:?default-compile}]??
  11. [INFO]?Compiling?1?source?file?to?D:?\code\hello-world\target\classes??
  12. [INFO]?------------------------------------------------------------------------??
  13. [INFO]?BUILD?SUCCESSFUL??
  14. [INFO]?------------------------------------------------------------------------??
  15. [INFO]?Total?time:?1?second??
  16. [INFO]?Finished?at:?Fri?Oct?09?02:08:09?CST?2009??
  17. [INFO]?Final?Memory:?9M/16M??
  18. [INFO]?------------------------------------------------------------------------??
  19. </span>??

?

clean告訴Maven清理輸出目錄target/,compile告訴Maven編譯項目主代碼,從輸出中我們看到Maven首先執行了clean:clean任務,刪除target/目錄,默認情況下Maven構建的所有輸出都在target/目錄中;接著執行resources:resources任務(未定義項目資源,暫且略過);最后執行compiler:compile任務,將項目主代碼編譯至target/classes目錄(編譯好的類為com/juvenxu/mvnbook/helloworld/HelloWorld.Class)。

上文提到的clean:clean、resources:resources,以及compiler:compile對應了一些Maven插件及插件目標,比如clean:clean是clean插件的clean目標,compiler:compile是compiler插件的compile目標,后文會詳細講述Maven插件及其編寫方法。

至此,Maven在沒有任何額外的配置的情況下就執行了項目的清理和編譯任務,接下來,我們編寫一些單元測試代碼并讓Maven執行自動化測試。

3.3 編寫測試代碼?Top

?

?

為了使項目結構保持清晰,主代碼與測試代碼應該分別位于獨立的目錄中。3.2節講過Maven項目中默認的主代碼目錄是src/main/java,對應地,Maven項目中默認的測試代碼目錄是src/test/java。因此,在編寫測試用例之前,我們先創建該目錄。

在Java世界中,由Kent Beck和Erich Gamma建立的JUnit是事實上的單元測試標準。要使用JUnit,我們首先需要為Hello World項目添加一個JUnit依賴,修改項目的POM如代碼清單3-3:

代碼清單3-3:為Hello World的POM添加依賴

Java代碼??收藏代碼
  1. <?xml?version="1.0"?encoding="UTF-8"?>??
  2. <project?xmlns="http://maven.apache.org/POM/4.0.0"??
  3. ?????????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"??
  4. ?????????xsi:schemaLocation="http://maven.apache.org/POM/4.0.0??
  5. http://maven.apache.org/maven-v4_0_0.xsd">??
  6. ??<modelVersion>4.0.0</modelVersion>??
  7. ??<groupId>com.juvenxu.mvnbook</groupId>??
  8. ??<artifactId>hello-world</artifactId>??
  9. ??<version>1.0-SNAPSHOT</version>??
  10. ??<name>Maven?Hello?World?Project</name>??
  11. ??<dependencies>??
  12. ????<dependency>??
  13. ???????<groupId>junit</groupId>??
  14. ???????<artifactId>junit</artifactId>??
  15. ???????<version>4.7</version>??
  16. ???????<scope>test</scope>??
  17. ????</dependency>??
  18. ??</dependencies>??
  19. </project>????

???? 代碼中添加了dependencies元素,該元素下可以包含多個dependency元素以聲明項目的依賴,這里我們添加了一個依賴——groupId是junit,artifactId是junit,version是4.7。前面我們提到groupId、artifactId和version是任何一個Maven項目最基本的坐標,JUnit也不例外,有了這段聲明,Maven就能夠自動下載junit-4.7.jar。也許你會問,Maven從哪里下載這個jar呢?在Maven之前,我們可以去JUnit的官網下載分發包。而現在有了Maven,它會自動訪問中央倉庫(http://repo1.maven.org/maven2/),下載需要的文件。讀者也可以自己訪問該倉庫,打開路徑junit/junit/4.7/,就能看到junit-4.7.pom和junit-4.7.jar。本書第6章會詳細介紹Maven倉庫及中央倉庫。

上述POM代碼中還有一個值為test的元素scope,scope為依賴范圍,若依賴范圍為test則表示該依賴只對測試有效,換句話說,測試代碼中的import JUnit代碼是沒有問題的,但是如果我們在主代碼中用import JUnit代碼,就會造成編譯錯誤。如果不聲明依賴范圍,那么默認值就是compile,表示該依賴對主代碼和測試代碼都有效。

配置了測試依賴,接著就可以編寫測試類,回顧一下前面的HelloWorld類,現在我們要測試該類的sayHello()方法,檢查其返回值是否為“Hello Maven”。在src/test/java目錄下創建文件,其內容如代碼清單3-4:

代碼清單3-4:Hello World的測試代碼

?

Java代碼??收藏代碼
  1. package?com.juvenxu.mvnbook.helloworld;??
  2. import?static?org.junit.Assert.assertEquals;??
  3. import?org.junit.Test;??
  4. ??
  5. public?class?HelloWorldTest??
  6. {??
  7. ????@Test??
  8. ????public?void?testSayHello()??
  9. ????{??
  10. ????????HelloWorld?helloWorld?=?new?HelloWorld();??
  11. ??
  12. ????????String?result?=?helloWorld.sayHello();??
  13. ??
  14. ????????assertEquals(?"Hello?Maven",?result?);??
  15. ????}??
  16. }???

一個典型的單元測試包含三個步驟:一,準備測試類及數據;二,執行要測試的行為;三,檢查結果。上述樣例中,我們首先初始化了一個要測試的HelloWorld實例,接著執行該實例的sayHello()方法并保存結果到result變量中,最后使用JUnit框架的Assert類檢查結果是否為我們期望的”Hello Maven”。在JUnit 3中,約定所有需要執行測試的方法都以test開頭,這里我們使用了JUnit 4,但我們仍然遵循這一約定,在JUnit 4中,需要執行的測試方法都應該以@Test進行標注。

測試用例編寫完畢之后就可以調用Maven執行測試,運行?mvn clean test?:

?

Java代碼??收藏代碼
  1. [INFO]?Scanning?for?projects...??
  2. [INFO]?------------------------------------------------------------------------??
  3. [INFO]?Building?Maven?Hello?World?Project??
  4. [INFO]????task-segment:?[clean,?test]??
  5. [INFO]?------------------------------------------------------------------------??
  6. [INFO]?[clean:clean?{execution:?default-clean}]??
  7. [INFO]?Deleting?directory?D:\git-juven\mvnbook\code\hello-world\target??
  8. [INFO]?[resources:resources?{execution:?default-resources}]??
  9. …??
  10. Downloading:?http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.pom??
  11. 1K?downloaded??(junit-4.7.pom)??
  12. [INFO]?[compiler:compile?{execution:?default-compile}]??
  13. [INFO]?Compiling?1?source?file?to?D:?\code\hello-world\target\classes??
  14. [INFO]?[resources:testResources?{execution:?default-testResources}]??
  15. …??
  16. Downloading:?http://repo1.maven.org/maven2/junit/junit/4.7/junit-4.7.jar??
  17. 226K?downloaded??(junit-4.7.jar)??
  18. [INFO]?[compiler:testCompile?{execution:?default-testCompile}]??
  19. [INFO]?Compiling?1?source?file?to?D:\?code\hello-world\target\test-classes??
  20. [INFO]?------------------------------------------------------------------------??
  21. [ERROR]?BUILD?FAILURE??
  22. [INFO]?------------------------------------------------------------------------??
  23. [INFO]?Compilation?failure??
  24. D:\code\hello-world\src\test\java\com\juvenxu\mvnbook\helloworld\HelloWorldTest.java:[8,5]?-source?1.3?中不支持注釋??
  25. (請使用?-source?5?或更高版本以啟用注釋)??
  26. ????@Test??
  27. [INFO]?------------------------------------------------------------------------??
  28. [INFO]?For?more?information,?run?Maven?with?the?-e?switch??
  29. ??…??
?

不幸的是構建失敗了,不過我們先耐心分析一下這段輸出(為了本書的簡潔,一些不重要的信息我用省略號略去了)。命令行輸入的是mvn clean test,而Maven實際執行的可不止這兩個任務,還有clean:clean、resources:resources、compiler:compile、resources:testResources以及compiler:testCompile。暫時我們需要了解的是,在Maven執行測試(test)之前,它會先自動執行項目主資源處理,主代碼編譯,測試資源處理,測試代碼編譯等工作,這是Maven生命周期的一個特性,本書后續章節會詳細解釋Maven的生命周期。

從輸出中我們還看到:Maven從中央倉庫下載了junit-4.7.pom和junit-4.7.jar這兩個文件到本地倉庫(~/.m2/repository)中,供所有Maven項目使用。

構建在執行compiler:testCompile任務的時候失敗了,Maven輸出提示我們需要使用-source 5或更高版本以啟動注釋,也就是前面提到的JUnit 4的@Test注解。這是Maven初學者常常會遇到的一個問題。由于歷史原因,Maven的核心插件之一compiler插件默認只支持編譯Java 1.3,因此我們需要配置該插件使其支持Java 5,見代碼清單3-5:

代碼清單3-5:配置maven-compiler-plugin支持Java 5

?

Java代碼??收藏代碼
  1. <project>??
  2. …??
  3. ??<build>??
  4. ????<plugins>??
  5. ???????<plugin>??
  6. ?????????<groupId>org.apache.maven.plugins</groupId>??
  7. ?????????<artifactId>maven-compiler-plugin</artifactId>??
  8. ?????????<configuration>??
  9. ???????????<source>1.5</source>??
  10. ???????????<target>1.5</target>??
  11. ?????????</configuration>??
  12. ???????</plugin>??
  13. ????</plugins>??
  14. ??</build>??
  15. …??
  16. </project>????

該POM省略了除插件配置以外的其他部分,我們暫且不去關心插件配置的細節,只需要知道compiler插件支持Java 5的編譯。現在再執行mvn clean test輸出如下:

?

Java代碼??收藏代碼
  1. …??
  2. [INFO]?[compiler:testCompile?{execution:?default-testCompile}]??
  3. [INFO]?Compiling?1?source?file?to?D:?\code\hello-world\target\test-classes??
  4. [INFO]?[surefire:test?{execution:?default-test}]??
  5. [INFO]?Surefire?report?directory:?D:\code\hello-world\target\surefire-reports??
  6. -------------------------------------------------------??
  7. ?T?E?S?T?S??
  8. -------------------------------------------------------??
  9. Running?com.juvenxu.mvnbook.helloworld.HelloWorldTest??
  10. Tests?run:?1,?Failures:?0,?Errors:?0,?Skipped:?0,?Time?elapsed:?0.055?sec??
  11. Results?:??
  12. Tests?run:?1,?Failures:?0,?Errors:?0,?Skipped:?0??
  13. [INFO]?------------------------------------------------------------------------??
  14. [INFO]?BUILD?SUCCESSFUL??
  15. [INFO]?------------------------------------------------------------------------??
  16. …??

我們看到compiler:testCompile任務執行成功了,測試代碼通過編譯之后在target/test-classes下生成了二進制文件,緊接著surefire:test任務運行測試,surefire是Maven世界中負責執行測試的插件,這里它運行測試用例HelloWorldTest,并且輸出測試報告,顯示一共運行了多少測試,失敗了多少,出錯了多少,跳過了多少。顯然,我們的測試通過了——BUILD SUCCESSFUL。

轉載于:https://www.cnblogs.com/hoobey/p/6071182.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394640.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394640.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394640.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

打印速度快點的打印機_SLM推出了功能強大的新型金屬3D打印機,速度快20倍

德國金屬3D打印機制造商SLM Solutions在Formnext Connect貿易展覽會上推出了功能強大的新系統NXG XII 600。SLM的大幅面機器配備了十二個可同時運行的1 KW激光器&#xff0c;使其速度比該公司自己的單激光SLM 280快20倍。NXG XII 600經過定制設計&#xff0c;可大量生產大型零件…

把轉變為json_如何使用7行JSON將您的網站轉變為移動應用程序

把轉變為jsonby Ethan通過伊桑 將Web引擎融合到本機應用程序的新方法 (A New Approach for Blending Web Engine into Native Apps) What if I told you the 7 lines of JSON above, colored in orange is all you need to turn a website into a mobile app? No need to rew…

1.7Oob 繼承關系中構造方法的使用

1&#xff1a;父類中最好要有一個空參數的構造方法&#xff0c;因為默認的構造方法在自定義了構造方法后就不存在了&#xff0c;需要顯示的寫出來。 若父類中沒有空參數的構造方法&#xff0c;則子類必須有自定義的構造方法&#xff0c;且用super&#xff08;&#xff09;調用父…

JavaScript浮點運算0.2+0.1 !== 0.3

浮點運算JavaScript 本文主要討論JavaScript的浮點運算&#xff0c;主要包括 JavaScript number基本類型二進制表示十進制浮點數的精度number 數字類型 在JavaScript中&#xff0c;數字只有number這一種類型; var intS 2,floatA 0.1; typeof intS; // number typeof floatA…

html獲取data-*值,html5 獲取和設置data-*屬性值的四種方法講解

1、獲取id的對象2、需要獲取的就是data-id 和 dtat-vice-id的值一&#xff1a;getAttribute()方法const getId document.getElementById(getId);// //getAttribute()取值屬性console.log(getId.getAttribute("data-id"));//console.log(getId.getAttribute("da…

三菱模擬量輸入與輸出程序_初學PLC是學習西門子還是三菱?

PLC的種類繁多&#xff0c;品牌大多分為歐系、日系、美系。德系PLC以西門子為主&#xff0c;日系有三菱、歐姆龍、松下……&#xff0c;美系有羅克韋爾(A-B)通用電氣(GE)公司、莫迪(MODICON)公司等。美國和歐洲的PLC技術是在相互隔離情況下獨立研究開發的&#xff0c;因此美國和…

性能測試十四:Xshell鏈接linux虛擬機

一、先裝一個linux虛擬機 VBoxcentos1、先下載Linux鏡像文件的ovf或者OVA文件2、打開vbox&#xff0c;點擊菜單欄“管理”-“導入虛擬電腦3、選擇解壓路徑中的ovf或者OVA文件&#xff0c;點擊下一步 4、點擊“導入”&#xff0c;等待完成5、導入成功后&#xff0c;選擇新導入的…

代碼編寫工具_我希望在開始編寫代碼時就已經知道的工具:已復習

代碼編寫工具by Mario Hoyos通過馬里奧霍約斯(Mario Hoyos) 我希望在開始編寫代碼時就已經知道的工具&#xff1a;已復習 (Tools I wish I had known about when I started coding: Revisited) A few days ago, I wrote this article for freeCodeCamp which has since gone o…

Hydra掃描姿勢

參數詳解&#xff1a; -R 根據上一次進度繼續破解 -S 使用SSL協議連接 -s 指定端口 -l 指定用戶名 -L 指定用戶名字典(文件) -p 指定密碼破解 -P 指定密碼字典(文件) -e 空密碼探測和指定用戶密碼探測(ns) -C 用戶名可以用:分割(username:password)可以代替-l username -p pass…

html5進度條插件 傳遞參數,Html5進度條插件(自寫)

(function () {window.H5ProgressBar function (obj) {this.height obj.height;this.width obj.width;this.speed obj.speed;};//在界面上布局元素H5ProgressBar.prototype.drawLayout function () {document.write("開始下載")document.write(" ")do…

python合并txt文本_Python實現將目錄中TXT合并成一個大TXT文件的方法

本文實例講述了Python實現將目錄中TXT合并成一個大TXT文件的方法。分享給大家供大家參考。具體如下&#xff1a; 在網上下了一個dota的英雄攻略,TXT格式,每個英雄一個文件,看得疼,就寫了一個小東西,合并一下. #codinggbk import os import sys import glob def dirTxtToLargeTx…

讀取字符串中的數字和小數

package com.jm.label.tools;import java.util.Map;import java.util.TreeMap;import java.util.regex.Matcher;import java.util.regex.Pattern;/** * 讀取字符串中的數字和小數 * author JM.H * */public class DigitUtil { public static String getNumber(String str){ …

html網頁設計要點,網站交互設計的8個要點

一、力求一致性例如網站首頁需要和每一個下級頁面保持一致的風格&#xff0c;導航都要放在屏幕的左上角&#xff0c;具有高度一致性的界面能給人清晰整潔的感覺。二、允許頻繁使用快捷鍵快捷鍵表示產品使用的靈活性和有效性&#xff0c;想想每次我們使用搜索引擎的時候是鼠標點…

行為擴展以及插件機制

在thinkPHP中的行為擴展和插件機制。 首先行為擴展這個概念是TP框架的核心組成之一&#xff0c;關于行為的解釋我就粗略的概括一下吧&#xff1a; TP在從接受到HTTP請求到最終將試圖輸出&#xff0c;期間經歷的很多步驟&#xff0c;這些步驟大家可以在http://document.thinkphp…

python android 庫_Python庫

Gevent Gevent是一個基于greenlet的Python的并發框架&#xff0c;以微線程greenlet為核心&#xff0c;使用了epoll事件監聽機制以及諸多其他優化而變得高效。 于greenlet、eventlet相比&#xff0c;性能略低&#xff0c;但是它封裝的API非常完善&#xff0c;最贊的是提供了一個…

ios 應用商店_如何在預算范圍內制作值得應用商店使用的iOS應用預覽

ios 應用商店Back in 2014, Apple made it possible to add an app preview to the the App Store. App previews are the best way to show potential users what your app has to offer before they download the app. In fact, users are 3x more likely to install an app …

搭建nfs共享存儲服務之二nfs服務端配置

1.1.NFS服務端配置文件路徑為&#xff1a; /etc/exports&#xff0c;并且默認為空&#xff0c;需要用戶自行配置。/etc/exports文件配置格式為&#xff1a;NFS共享的目錄 NFS客戶端地址1&#xff08;參數1&#xff0c;參數2...&#xff09;客戶端地址2&#xff08;參數1&#x…

計算機word基本知識選擇題,2017計算機基礎考試選擇題「附答案」

2017計算機基礎考試選擇題「附答案」一、單項選擇題(每題1.5分&#xff0c;共30分)1、文件名使用通配符的作用是(b)A、減少文件名所占用的磁盤空間B、便于一次處理多個文件C、便于給一個文件命名D、便于保存文件2、操作系統是一種(a)A、系統軟件 B、系統程序庫 C、編譯程序系統…

[JLOI2015]管道連接(斯坦納樹)

[Luogu3264] 原題解 多個頻道,每個頻道的關鍵點要求相互聯通 詳見代碼,非常巧妙 #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<queue> #define debug(...) fprintf(stderr,__VA_ARGS__) #define Debug(…

關于web前端的學習路線

第一階段&#xff1a; HTMLCSS:HTML進階、CSS進階、divcss布局、HTMLcss整站開發、 JavaScript基礎&#xff1a;Js基礎教程、js內置對象常用方法、常見DOM樹操作大全、ECMAscript、DOM、BOM、定時器和焦點圖。 JS基本特效&#xff1a;常見特效、例如&#xff1a;tab、導航、整頁…