使用mockito与testng
Testng是一个开源自动化测试框架,该框架是为了执行单位,函数,端到端,集成测试。
Testng需要最小Java JDK 5.基于,
TestNG is a testing framework inspired from JUnit and NUnit but introducing some new functionalities that make it more powerful and easier to use like Annotation, Support for parameters etc.
在Testng中,NG表示n ext g升天。
Testng类似于JUnit,但它不是JUnit扩展。
它肯定是junit的动力。
与JUnit相比,Testng中可以更好地完成集成测试。
JUNIT VS TESTNG.
Testng和Junit在他们的核心行为中有所不同:
- JUnit在所有测试方法中实例化程序。这意味着这些字段是唯一的或者本地测试用例我们编写的每个测试用例,它们不会在测试用例中共享,这也可能是一个缺点。
- 在testng中,只创建一个对象,其字段状态在我们写入的@Test案例中共享。
为了使我们在测试用例中使用Mockito注释,如@Mock或者@spy或者许多其他注释,我们必须以编程方式启用它们。
这可以通过执行以下操作来完成:
@BeforeMethod public void init() { MockitoAnnotations.initMocks(this); }
对于JUNIT,它在框中工作,因为2nd @test有自己的字段和自己的模拟。
Mockito与Testng.
现在,让我们来看看Testng工作中的断言,我们也将使用Mockito来模拟。
准备工作
我假设我们已在Eclipse中安装了Testng插件。
创建Mockito Testng示例的步骤。
第1步:创建一个简单的Java Maven项目。
maven依赖
第2步:将所需的依赖项添加到pom.xml
Maven依赖是Mockito开始最快的方法:
<!-- https://mvnrepository.com/artifact/org.mockito/mockito-all --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> </dependency>
只是一个依赖性,不会带来任何其他库。
请参阅此处获取最新版本的库。
由于我们也将使用一些Testng函数,我们还需要其依赖。
让我们添加它,
<!-- https://mvnrepository.com/artifact/org.testng/testng --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.11</version> <scope>test</scope> </dependency>
pom.xml将如下所示:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.igi.theitroad</groupId> <artifactId>MockitoTestNGExample</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <!-- https://mvnrepository.com/artifact/org.mockito/mockito-all --> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-all</artifactId> <version>1.9.5</version> </dependency> <!-- https://mvnrepository.com/artifact/org.testng/testng --> <dependency> <groupId>org.testng</groupId> <artifactId>testng</artifactId> <version>6.11</version> <scope>test</scope> </dependency> </dependencies> </project>
第3步:让我们定义我们的类来测试:
package org.igi.theitroad.mockito; public class CreateNumber { public int getThreeDigitNumber() { return (int) (Math.random() * 1000); } }
最后,让我们把上面的简单程序进行测试。
package org.igi.theitroad.mockito; import org.mockito.Mockito; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; public class TestNgTest { private CreateNumber createNumber = null; @BeforeClass public void init() { createNumber = Mockito.mock(CreateNumber.class); } @Test public void testWith_TestNG() { int expected = 100; Mockito.when(createNumber.getThreeDigitNumber()).thenReturn(expected); int actual = createNumber.getThreeDigitNumber(); Assert.assertEquals(actual, expected); } }
第4步:创建testing.xml
<?xml version="1.0" encoding="UTF-8"?> <suite name="Number test Suite"> <test name="Create Number test"> <classes> <class name="org.igi.theitroad.mockito.TestNgTest" </classes> </test> </suite>
步骤5:运行测试右键单击testng.xml,然后选择"Testng Suite",我们将得到以下输出:
请注意,Testng不会在同一测试类中重新创建测试类(并且不幸的是,Mockito如果该实例不是NULL,则不会重新创建@INJECKTMOCKS对象),这将导致模拟/测试对象即使initmocks调用处于@ beForeMethod注释的方法,也没有重新创建不同的测试方法。
为什么使用testng?
如果没有@Mock注释在Mockito中,将为所有@Test注释的方法进行验证()调用。
此问题需要修复,其唯一的解决方案是在@BeforeMethod中使用此主题或者新的模拟(这似乎没有合理)。
此默认行为更好,其中模拟不会预计将从以前的测试中持续状态。