当通过testng.xml或命令行把测试类传递给TestNG时,TestNG会调用这些测试类的无参构造方法,将这些类实例化,然后执行在每个类中的测试方法。

如果假设某个测试类中构造方法是有参的,那么运行时,TestNG会报出TestNGException异常,因为无法初始化这个类(该类没有无参构造方法),报错见下。

org.testng.TestNGException:
Can't invoke public void testNGtest.TestFactory.testInitialChar() throws java.io.IOException: either make it static or add a no-args constructor to your class

针对这个问题,我们可以在该测试类中添加无参数的构造方法。但是这样做的话很不方便,这意味着无法灵活的、动态的创建该测试类的实例,没有实际的意使用义。

这个时候就需要使用TestNG的@Factory注解了。

被@Factory注解的方法必须是返回一个对象数组的方法。而且这些返回的对象数组中的对象必须包含TestNG annotation的类的实例。

我们可以把@Factory方法和@Test方法放在同一个类中,因为一方面@Factory方法只会被调用一次,另一方面@Factory方法优先于@Test方法和配置方法被调用,只有当所有的@Factory方法被调用之后,TestNG才执行@Test方法和配置方法。

现在用一个简单的例子来验证@Factory方法的一些特性与熟悉@Factory方法的基础使用方法。

假设我们要做如下测试工作:针对一组给定文件路径名称的txt文件,我们需要验证这些txt文件内容中的首字母是否是‘a’。

可以先创建测试类,该类中有一个有参构造方法,一个获取指定路径的文件内容的首字母的实例方法,和一个@Test方法,用于比较指定路径的文件内容的首字母是否与预期相同。

public class TestFactory{private String path;private char expectedInitialChar;public TestFactory(String path, char expected){this.path = path;this.expectedInitialChar = expected;}@Testpublic void testInitialChar() throws IOException {Assert.assertEquals(this.getInitialChar(path), this.expectedInitialChar);}public char getInitialChar(String path) throws IOException{File file = new File(path);FileInputStream is = new FileInputStream(file);byte[] byteBuffer = null;try {byteBuffer = new byte[is.available()];} catch (IOException e) {            e.printStackTrace();}int read = 0;while ((read = is.read(byteBuffer)) != -1) {System.out.write(byteBuffer, 0, read);}return (char) byteBuffer[0];}}

如果此时直接使用TestNG运行该测试类会报错

org.testng.TestNGException:
Can't invoke public void testNGtest.TestFactory.testInitialChar() throws java.io.IOException: either make it static or add a no-args constructor to your class

所以我们再到该测试类中添加一个@Factory方法,批量生成测试实例,代码见下:

    @Factorypublic static Object[] create() throws IOException{List<TestFactory> result = new ArrayList<TestFactory>();String[] paths = {"d:/a.txt","d:/b.txt"};char expected = 'a';for(String path:paths){result.add(new TestFactory(path, expected));}        return result.toArray();}

这个时候我们再使用TestNG运行该测试类就OK啦

PASSED: File's path: d:/a.txt
FAILED: File's path: d:/b.txt
java.lang.AssertionError: expected [a] but found [b]at org.testng.Assert.fail(Assert.java:94)at org.testng.Assert.failNotEquals(Assert.java:494)at org.testng.Assert.assertEquals(Assert.java:123)at org.testng.Assert.assertEquals(Assert.java:328)at org.testng.Assert.assertEquals(Assert.java:338)at testNGtest.TestFactory.testContent(TestFactory.java:32)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:84)at org.testng.internal.Invoker.invokeMethod(Invoker.java:714)at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901)at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231)at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127)at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111)at org.testng.TestRunner.privateRun(TestRunner.java:767)at org.testng.TestRunner.run(TestRunner.java:617)at org.testng.SuiteRunner.runTest(SuiteRunner.java:334)at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329)at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291)at org.testng.SuiteRunner.run(SuiteRunner.java:240)at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)at org.testng.TestNG.runSuitesSequentially(TestNG.java:1224)at org.testng.TestNG.runSuitesLocally(TestNG.java:1149)at org.testng.TestNG.run(TestNG.java:1057)at org.testng.remote.RemoteTestNG.run(RemoteTestNG.java:111)at org.testng.remote.RemoteTestNG.initAndRun(RemoteTestNG.java:204)at org.testng.remote.RemoteTestNG.main(RemoteTestNG.java:175)===============================================Default testTests run: 2, Failures: 1, Skips: 0
===============================================

转载于:https://www.cnblogs.com/zhaochifan/p/5216383.html

学习使用TestNG中的注解(2)——@Factory的使用相关推荐

  1. Dubbo学习记录(八) -- Spring整合Dubbo中@Reference注解解析原理

    Spring整合Dubbo中@Reference注解解析原理 @Reference: 可以用在属性或者方法, 意味着需要引用某个Dubbo服务, 那么Dubbo整合Spring后, 我很好奇怎么把这个 ...

  2. spring中使用注解代替xml配置

    今天两部分内容,第一部分是注解,使用注解配置Spring,然后第二个是Spring中的AOP,今天就需要这两部分,也没有练习,第一个注解配置Spring,这三大框架都是用注解来配置,这三大框架,都是支 ...

  3. Java中的注解(Annotation)处理器解析

    Java中的注解(Annotation)是一个很神奇的东西,特别现在有很多Android库都是使用注解的方式来实现的.一直想详细了解一下其中的原理.很有幸阅读到一篇详细解释编写注解处理器的文章.本文的 ...

  4. 学习编程过程中-->遇到的错误

    文章目录 学习编程过程中-->遇到的错误(吕招焕) 1.java.sql.SQLException: Parameter index out of range (2 > number of ...

  5. 《一起学习rgbdSLAM》中g2o部分报错的问题

    <一起学习rgbdSLAM>中g2o部分报错的问题 在高博的<一起学习rgbdSLAM>第六讲中使用到了g2o工具.但是由于版本问题,按照高博的写法来编写代码在编译过程中会报错 ...

  6. java中的注解(二)

    今天我继续来介绍java中的注解.注解与接口和类不同的是注解是不允许继承的,但是注解中有一个和继承有关的元注解:@Inherited.如果我们在定义注解时候加上这个元注解那么我们就可以在子类中监测到该 ...

  7. 注解报错_Java中的注解使用:全面性的总结一下

    前话: 今天,我们又来聊一下注解的使用,做一下详细的解析,也介绍了自定义注解,请耐心往下看哟! 注解的介绍: 在2005年,sun公司推出了jdk1.5,同时推出的注解功能吸引了很多人的目光,使用注解 ...

  8. 学习Kotlin(七)反射和注解

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  9. 第六章 深度学习(上中)

    其他的深度学习模型 在整本书中,我们聚焦在解决 MNIST 数字分类问题上.这一"下金蛋的"问题让我们深入理解了一些强大的想法:随机梯度下降,BP,卷积网络,正规化等等.但是该问题 ...

  10. 五十八、深入了解 Java 中的注解和自定义注解

    @Author:Runsen @Date:2020/7/9 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏艰 ...

最新文章

  1. !! 机器学习常用工具
  2. 制作模块-安装模块压缩包
  3. 字符串匹配(多模式匹配篇)
  4. 国家开放大学2021春1127实用卫生统计学题目
  5. Java学习--泛型
  6. JS导出txt文本文件,Netsuite方案
  7. Visual Studio 2019 v16.9 Preview 3 发布
  8. 拿来就用:11款不容错过的 Node.js 框架
  9. [短评] 技术研发向市场运营让步
  10. Codeforces Round #179 (Div. 2): D. Greg and Graph(Floyd)
  11. 一些出的不错的Java面试题(一)
  12. 图像降噪:Scale-Space and Edge Detection Using Anisotropic Diffusion
  13. java根据出生日期计算年龄_通过出生日期获取年龄的方法--Java
  14. 校友会2019中国大学计算机,校友会2019中国大学一流专业排名800强发布,北大清华复旦前三...
  15. 上海双非改考408,与上海计算所联合培养!上海第二工业大学计算机专硕!
  16. OpenCV-细化算法(thinning algorithm)描绘出轮廓的中心线
  17. syzkaller--->syscalldescription语法
  18. 我的世界电脑版服务器区块怎么显示,我的世界区块显示指令 | 手游网游页游攻略大全...
  19. 企业微信收款码快速开通方法
  20. 关于win 10 WLAN连接红叉的问题解决

热门文章

  1. ADL之UI初预览 AJAX 开发
  2. C语言随机读写数据文件(二)
  3. 最简单的List集合排序方法
  4. liunx 下mysql 的安装(转载)
  5. MySQL error(2014) Commands out of sync; you can't run this command now(情形2)
  6. 递归下降分析器 c++_专业围观质谱:汇总常见质谱仪专业对比分析!质量分析器直白解剖让你秒懂!...
  7. ROS学习记录:在ROS的Rviz下完成摄像头的视频显示
  8. cpoint 两个点距离_Wasserstein距离学习笔记
  9. java w3c解析xml乱码_下载xml 中文乱码
  10. 谷粒商城:Oss endpoint can‘t be empty.