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.mzph.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、导航、整页…