您的位置:软件测试 > 开源软件测试 > 开源单元测试工具 > junit
JUnit + Mockito单元测试
作者:网络转载 发布时间:[ 2016/12/29 11:43:39 ] 推荐标签:单元测试 Junit

  JUnit 是 2015 年 Java 开发者引用多的库,是 Java 单元测试框架里无可争议的 No.1。JUnit 基本上能覆盖大部分接口的测试,但如果待测接口依赖外部服务,比如我之前写的这篇小文里描述的情况,JUnit 可能捉襟见肘了。而 Mockito 在 Mock 数据方面功能强大,正好弥补了 JUnit 在这方面的不足。风云合璧,摩诃无量。
  上面其实已经点到 JUnit 和 Mockito 的不同了,虽然二者都是运用在单元测试中,但 JUnit 侧重对接口的运行状态和结果的测试,而 Mockito 侧重 “Mock” 数据,即对对象的模拟,尤其是不容易构造的复杂对象。
  JUnit + Mockito 组合的优势是显而易见的,对于服务化的系统,有了这个组合,能实现各上下游模块并行开发,同时进行单元测试验证可用性,减少串行联调的时间。
  JUnit
  PS: 虽然 JUnit5 已经发布,但目前使用多的还是 JUnit4,所以本文仍然基于 JUnit4。
  利用 Maven 初始化一个简单的 Java 应用:
  mvn archetype:generate -DgroupId=com.isudox -DartifactId=test-demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  Maven 会自动创建好类文件和测试类,路径如下:
test-demo
├── pom.xml       ---- pom 依赖配置文件
└── src           ---- 源码路径
├── main      ---- 类文件
│   └── java
│       └── com
│           └── isudox
│               └── App.java
└── test      ---- 测试类
└── java
└── com
└── isudox
└── AppTest.java
  在 pom.xml 中引入 JUnit4,
<dependencies>
<!-- junit4 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
</dependencies>
  引入 JUnit 依赖后,能在测试类中,通过 JUnit 提供的注解和静态方法,对接口进行测试了。先编写一个简单的待测试类 Calculator.java
// App.java
public classCalculator{
publicintevaluate(String expression)throwsException{
if (expression == null)
throw new Exception("null value");
int sum = 0;
for (String summand: expression.split("\+"))
sum += Integer.valueOf(summand);
return sum;
}
}
  然后在 src/test/ 路径下创建同样的包,将测试类命名为 CalculatorTest.java,如果是用 IntelliJ IDEA,可以直接在待测试类下通过快捷键 Ctrl+Shift+T 生成对应的测试类——
// CalculatorTest.java
import org.junit.Test;
import static org.junit.Assert.*;
public classCalculatorTest{
@Test
publicvoidevaluate()throwsException{
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
}
}
  执行 mvn test ,反馈得接口运行正确。
  在上面这段简单的代码里,引入了 JUnit 的 @Test 注解和 Assert 下的系列静态断言方法。其中 @Test 注解把方法包装为测试方法, assertEquals 方法用来断言两个入参是否一致。通过这个简单的例子实现了对待测方法的测试。
  JUnit 支持丰富的测试规则,除了 @Test 注解外,还有下面这些注解——
  @Before 注解的作用是使被标记的方法在测试类里每个方法执行前调用;同理 After 使被标记方法在当前测试类里每个方法执行后调用。
  @BeforeClass 注解的作用是使被标记的方法在当前测试类被实例化前调用;同理 @AfterClass 使被标记的方法在测试类被实例化后调用。
  @Ignore 注解的作用是使被标记方法暂时不执行。
  参考下面这段代码的运行:
import org.junit.*;
import static org.junit.Assert.*;
public classCalculatorTest{
publicCalculatorTest(){
System.out.println("Constructor");
}
@BeforeClass
publicstaticvoidbeforeThis()throwsException{
System.out.println("BeforeClass");
}
@AfterClass
publicstaticvoidafterThis()throwsException{
System.out.println("AfterClass");
}
@Before
publicvoidsetUp()throwsException{
System.out.println("Before");
}
@After
publicvoidtearDown()throwsException{
System.out.println("After");
}
@Test
publicvoidevaluate()throwsException{
Calculator calculator = new Calculator();
int sum = calculator.evaluate("1+2+3");
assertEquals(6, sum);
System.out.println("Test evaluate");
}
@Test
publicvoididiot()throwsException{
assertTrue(true);
System.out.println("Test idiot");
}
@Ignore
publicvoidignoreMe()throwsException{
System.out.println("Ignore");
}
}
  测试结果如下,从输出结果可以印证不同注解对执行顺序的影响:
  BeforeClass
  Constructor
  Before
  Test idiot
  After
  Constructor
  Before
  Test evaluate
  After
  AfterClass
  另外,每个测试方法执行时都会实例化一次测试类,JUnit 这样处理的原因是保证每个测试方法彼此独立互不干扰。
  对于 @Test 注解标记的方法, @Test 支持两个参数的设置: timeout 和 expected 。前者是设置待测方法的执行超时时间,后者是设置对待测方法期望的抛出异常。修改 evaluate 测试方法的注解:
  @Test(timeout = 100, expected = Exception.class)
  publicvoidevaluate()throwsException{
  Calculator calculator = new Calculator();
  int sum = calculator.evaluate(null);
  assertEquals(6, sum);
  i++;
  System.out.println("Test evaluate " + i);
  }
  Maven 运行测试,从结果可以看到,方法抛出了异常,测试通过。
  Mockito
  相对于 JUnit,Mockito 则是 Mock 数据的测试框架,它简化了对有外部依赖的类的单元测试。Mockito 的工作流程如下图示( 图片来源 ):

  首先在 pom.xml 中导入 mockito 依赖,
  pom.xml 依赖中添加 Mockito:
  <dependency>
  <groupId>org.mockito</groupId>
  <artifactId>mockito-core</artifactId>
  <version>2.2.0</version>
  <scope>test</scope>
  </dependency>

上一页12下一页
软件测试工具 | 联系我们 | 投诉建议 | 诚聘英才 | 申请使用列表 | 网站地图
沪ICP备07036474 2003-2017 版权所有 上海泽众软件科技有限公司 Shanghai ZeZhong Software Co.,Ltd