EasyMock 快速指南



EasyMock - 概述

什么是模拟(Mocking)?

模拟是一种隔离测试类功能的方法。模拟不需要数据库连接或属性文件读取或文件服务器读取来测试功能。模拟对象模拟真实服务。模拟对象返回与传递给它的某些虚拟输入相对应的虚拟数据。

EasyMock

EasyMock 方便无缝创建模拟对象。它使用 Java 反射来为给定的接口创建模拟对象。模拟对象只是实际实现的代理。考虑一个返回股票价格详情的股票服务案例。在开发过程中,无法使用实际的股票服务来获取实时数据。因此,我们需要股票服务的虚拟实现。EasyMock 可以像其名称所暗示的那样轻松地做到这一点。

EasyMock 的优势

  • 无需手动编写 − 无需自行编写模拟对象。

  • 重构安全 − 重命名接口方法名称或重新排序参数不会破坏测试代码,因为模拟对象是在运行时创建的。

  • 支持返回值 − 支持返回值。

  • 支持异常 − 支持异常。

  • 支持顺序检查 − 支持检查方法调用的顺序。

  • 支持注解 − 支持使用注解创建模拟对象。

示例

考虑以下代码片段。

package com.tutorialspoint.mock;

import java.util.ArrayList;
import java.util.List;
import org.EasyMock.EasyMock;

public class PortfolioTester {
   public static void main(String[] args){
      //Create a portfolio object which is to be tested		
      Portfolio portfolio = new Portfolio();

      //Creates a list of stocks to be added to the portfolio
      List<Stock> stocks = new ArrayList<Stock>();
      Stock googleStock = new Stock("1","Google", 10);
      Stock microsoftStock = new Stock("2","Microsoft",100);

      stocks.add(googleStock);
      stocks.add(microsoftStock);		

      //Create the mock object of stock service
      StockService stockServiceMock = EasyMock.createMock(StockService.class);

      // mock the behavior of stock service to return the value of various stocks
      EasyMock.expect(stockServiceMock.getPrice(googleStock)).andReturn(50.00);
      EasyMock.expect(stockServiceMock.getPrice(microsoftStock)).andReturn(1000.00);
      EasyMock.replay(stockServiceMock);

      //add stocks to the portfolio
      portfolio.setStocks(stocks);

      //set the stockService to the portfolio
      portfolio.setStockService(stockServiceMock);
      double marketValue = portfolio.getMarketValue();

      //verify the market value to be 
      //10*50.00 + 100* 1000.00 = 500.00 + 100000.00 = 100500
      System.out.println("Market value of the portfolio: "+ marketValue);
   }
}

让我们了解上述程序的重要概念。完整代码可在第一个应用程序章节中找到。

  • 投资组合(Portfolio) − 一个对象,用于携带股票列表并使用股票价格和股票数量计算市值。

  • 股票(Stock) − 一个对象,用于携带股票的详细信息,例如其 ID、名称、数量等。

  • 股票服务(StockService) − 股票服务返回股票的当前价格。

  • EasyMock.createMock(...) − EasyMock 创建了一个股票服务的模拟对象。

  • EasyMock.expect(...).andReturn(...) − StockService 接口的 getPrice 方法的模拟实现。对于 googleStock,返回 50.00 作为价格。

  • EasyMock.replay(...) − EasyMock 准备模拟对象,使其可以用于测试。

  • portfolio.setStocks(...) − 投资组合现在包含两个股票的列表。

  • portfolio.setStockService(...) − 将 stockService 模拟对象分配给投资组合。

  • portfolio.getMarketValue() − 投资组合使用模拟股票服务根据其股票返回市值。

EasyMock - 环境搭建

本章将引导您完成在基于 Windows 和 Linux 的系统上设置 EasyMock 的过程。EasyMock 可以轻松安装并与您当前的 Java 环境集成,只需遵循几个简单的步骤,无需任何复杂的设置程序。安装期间需要用户管理权限。

系统要求

JDK Java SE 2 JDK 1.5 或更高版本
内存 1 GB RAM(推荐)
磁盘空间 无最低要求
操作系统版本 Windows XP 或更高版本,Linux

现在让我们继续安装 EasyMock 的步骤。

步骤 1:验证您的 Java 安装

首先,您需要在系统上安装 Java 软件开发工具包 (SDK)。要验证这一点,请根据您正在使用的平台执行以下两个命令中的任何一个。

如果 Java 安装已正确完成,则它将显示 Java 安装的当前版本和规范。样本输出如下表所示。

平台 命令 示例输出
Windows

打开命令控制台并输入

\>java –version

java version "11.0.11" 2021-04-20 LTS

Java(TM) SE Runtime Environment 18.9 (build 11.0.11+9-LTS-194)

Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.11+9-LTS-194, mixed mode)

Linux

打开命令终端并输入

$java –version

java version "11.0.11" 2021-04-20 LTS

Open JDK Runtime Environment 18.9 (build 11.0.11+9-LTS-194)

Open JDK 64-Bit Server VM (build 11.0.11+9-LTS-194, mixed mode)

步骤 2:设置您的 Java 环境

设置环境变量 JAVA_HOME 以指向 Java 安装在您机器上的基本目录位置。例如:

序号 平台和描述
1

Windows

将 JAVA_HOME 设置为 C:\ProgramFiles\java\jdk11.0.11

2

Linux

export JAVA_HOME = /usr/local/java-current

将 Java 编译器位置的完整路径附加到系统路径。

序号 平台和描述
1

Windows

将字符串 "C:\Program Files\Java\jdk11.0.11\bin" 附加到系统变量 PATH 的末尾。

2

Linux

export PATH = $PATH:$JAVA_HOME/bin/

从命令提示符执行命令java -version,如上所述。

步骤 3:安装 EasyMock 库

https://easymock.org/下载最新版本的 EasyMock 并将其内容解压缩到一个文件夹中,从中可以将所需的库链接到您的 Java 程序。让我们假设这些文件收集在 C 盘上的一个文件夹中。

将所需jars的完整路径添加到 CLASSPATH,如下所示。

序号 平台和描述
1

Windows

将以下字符串附加到用户变量的末尾

CLASSPATH −

C:\easymock\easymock-4.3.jar;

2

Linux

export CLASSPATH = $CLASSPATH

/usr/share/easymock\easymock-4.3.tar

步骤 4:下载 JUnit 存档

Github下载最新版本的 JUnit jar 文件。将文件夹保存到 C:\>Junit 位置。

操作系统 存档名称
Windows junit4.13.2.jar, hamcrest-core-1.3.jar
Linux junit4.13.2.jar, hamcrest-core-1.3.jar

步骤 5:设置 JUnit 环境

设置JUNIT_HOME环境变量以指向 JUnit jar 文件存储在您机器上的基本目录位置。下表显示了如何在不同的操作系统上设置此环境变量,假设我们已将 junit4.13.2.jar 和 hamcrest-core-1.3.jar 存储在 C:\>Junit。

操作系统 输出
Windows 将环境变量 JUNIT_HOME 设置为 C:\JUNIT
Linux export JUNIT_HOME=/usr/local/JUNIT

步骤 6:设置 CLASSPATH 变量

设置 CLASSPATH 环境变量以指向 JUNIT jar 文件位置。下表显示了如何在不同的操作系统上执行此操作。

操作系统 输出
Windows 将环境变量 CLASSPATH 设置为 %CLASSPATH%;%JUNIT_HOME%\junit4.13.2.jar;%JUNIT_HOME%\hamcrest-core-1.3.jar;.
Linux Export CLASSPATH=$CLASSPATH:$JUNIT_HOME/junit4.13.2.jar:$JUNIT_HOME/hamcrest-core-1.3.jar:.

EasyMock - 第一个应用程序

在详细介绍 EasyMock 框架之前,让我们看看一个实际应用。在这个示例中,我们创建了一个股票服务的模拟对象来获取一些股票的虚拟价格,并对名为 Portfolio 的 Java 类进行了单元测试。

该过程将在下面分步骤讨论。

示例

步骤 1:创建一个 JAVA 类来表示股票

文件:Stock.java

public class Stock {
   private String stockId;
   private String name;	
   private int quantity;

   public Stock(String stockId, String name, int quantity){
      this.stockId = stockId;
      this.name = name;		
      this.quantity = quantity;		
   }
   public String getStockId() {
      return stockId;
   }
   public void setStockId(String stockId) {
      this.stockId = stockId;
   }
   public int getQuantity() {
      return quantity;
   }
   public String getTicker() {
      return name;
   }
}

步骤 2:创建一个 StockService 接口来获取股票的价格。

文件:StockService.java

public interface StockService {
   public double getPrice(Stock stock);
}

步骤 3:创建一个 Portfolio 类来表示任何客户的投资组合。

文件:Portfolio.java

import java.util.List;

public class Portfolio {
   private StockService stockService;
   private List<Stock> stocks;

   public StockService getStockService() {
      return stockService;
   }
   public void setStockService(StockService stockService) {
      this.stockService = stockService;
   }
   public List<Stock> getStocks() {
      return stocks;
   }
   public void setStocks(List<Stock> stocks) {
      this.stocks = stocks;
   }
   public double getMarketValue(){
      double marketValue = 0.0;
      for(Stock stock:stocks){
         marketValue += stockService.getPrice(stock) * stock.getQuantity();
      }
      return marketValue;
   }
}

步骤 4:测试 Portfolio 类

让我们通过向其中注入 stockservice 的模拟对象来测试 Portfolio 类。模拟对象将由 EasyMock 创建。

文件:PortfolioTester.java

import java.util.ArrayList;
import java.util.List;
import org.easymock.EasyMock;

public class PortfolioTester {
   Portfolio portfolio;	
   StockService stockService;

   public static void main(String[] args){
      PortfolioTester tester = new PortfolioTester();
      tester.setUp();
      System.out.println(tester.testMarketValue()?"pass":"fail");
   }
   public void setUp(){
      //Create a portfolio object which is to be tested		
      portfolio = new Portfolio();		
      
      //Create the mock object of stock service
      stockService = EasyMock.createMock(StockService.class);		
      
      //set the stockService to the portfolio
      portfolio.setStockService(stockService);
   }
   public boolean testMarketValue(){
      //Creates a list of stocks to be added to the portfolio
      List<Stock> stocks = new ArrayList<Stock>();
      Stock googleStock = new Stock("1","Google", 10);
      Stock microsoftStock = new Stock("2","Microsoft",100);	
      
      stocks.add(googleStock);
      stocks.add(microsoftStock);

      //add stocks to the portfolio
      portfolio.setStocks(stocks);

      // mock the behavior of stock service to return the value of various stocks
      EasyMock.expect(stockService.getPrice(googleStock)).andReturn(50.00);
      EasyMock.expect(stockService.getPrice(microsoftStock)).andReturn(1000.00);		

      // activate the mock
      EasyMock.replay(stockService);		

      double marketValue = portfolio.getMarketValue();		
      return marketValue == 100500.0;
   }
}

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Stock.java StockService.java Portfolio.java PortfolioTester.java

现在运行 PortfolioTester 以查看结果:

C:\EasyMock_WORKSPACE>java PortfolioTester

输出

验证输出

pass

EasyMock - JUnit 集成

在本章中,我们将学习如何将 JUnit 和 EasyMock 集成在一起。在这里,我们将创建一个数学应用程序,它使用 CalculatorService 执行基本的数学运算,例如加法、减法、乘法和除法。我们将使用 EasyMock 模拟 CalculatorService 的虚拟实现。此外,我们还广泛使用了注解来展示它们与 JUnit 和 EasyMock 的兼容性。

示例

该过程将在下面分步骤讨论。

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;

   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
   }
}

步骤 4:创建一个类来执行测试用例。

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac CalculatorService.java MathApplication.java MathApplicationTester.java TestRunner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

要了解有关 JUnit 的更多信息,请参阅 Tutorials Point 上的 JUnit 教程。

EasyMock - 添加行为

EasyMock 使用expect()expectLassCall()方法向模拟对象添加功能。查看以下代码片段。

//add the behavior of calc service to add two numbers
EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

在这里,我们指示 EasyMock 为 calcService 的 add 方法添加 10 和 20 的行为,并因此返回 30.00 的值。

此时,Mock 只记录了行为,但它并没有作为模拟对象工作。调用 replay 后,它按预期工作。

//add the behavior of calc service to add two numbers
EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

//activate the mock
//EasyMock.replay(calcService);

无 EasyMock.Replay() 的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;

   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

//@RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify the class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

      //activate the mock
      //EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

testAdd(MathApplicationTester): expected:<0.0> but was:<30.0>
false

有 EasyMock.Replay() 的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数。

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication。

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   // @Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      // add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

      //activate the mock
      EasyMock.replay(calcService);	
		
      // test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果。

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

EasyMock - 验证行为

EasyMock 可以确保是否正在使用模拟对象。这是使用verify()方法完成的。查看以下代码片段。

//activate the mock
EasyMock.replay(calcService);

//test the add functionality
Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

//verify call to calcService is made or not
EasyMock.verify(calcService);

无 EasyMock.Verify() 的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      //return calcService.add(input1, input2);
      return input1 + input2;
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      //EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果。

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

有 EasyMock.Verify() 的示例

步骤 1:创建一个 CalculatorService 接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      //return calcService.add(input1, input2);
      return input1 + input2;
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);

      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

testAdd(MathApplicationTester): 
   Expectation failure on verify:
      CalculatorService.add(10.0, 20.0): expected: 1, actual: 0
false

EasyMock - 期望调用

EasyMock 对特定方法可以调用的次数进行特殊检查。假设 MathApplication 应该只调用 CalculatorService.serviceUsed() 方法一次,那么它不应该能够调用 CalculatorService.serviceUsed() 多于一次。

//add the behavior of calc service to add two numbers and serviceUsed.
EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
calcService.serviceUsed();

//limit the method call to 1, no less and no more calls are allowed
EasyMock.expectLastCall().times(1);

创建 CalculatorService 接口如下所示。

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

calcService.serviceUsed() 调用一次的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){		
      calcService.serviceUsed();
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   // @Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().times(1);
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

calcService.serviceUsed() 调用两次的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数。

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication。

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){		
      calcService.serviceUsed();
      calcService.serviceUsed();
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;
	
   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().times(1);
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful()); 
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac CalculatorService.java MathApplication.java MathApplicationTester.java TestRunner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

testAdd(com.tutorialspoint.mock.MathApplicationTester):  
   Unexpected method call CalculatorService.serviceUsed():
      CalculatorService.add(10.0, 20.0): expected: 1, actual: 0
      CalculatorService.serviceUsed(): expected: 1, actual: 2
false

不调用 calcService.serviceUsed() 的示例

步骤 1:创建一个 Calculator Service 接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){		
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().times(1);
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

testAdd(com.tutorialspoint.mock.MathApplicationTester): 
   Expectation failure on verify:
      CalculatorService.serviceUsed(): expected: 1, actual: 0
false

EasyMock - 多次调用

EasyMock 提供以下附加方法来改变预期的调用次数。

  • times(int min, int max) − 期望在 min 和 max 调用之间。

  • atLeastOnce() − 期望至少一次调用。

  • anyTimes() − 期望无限次调用。

times(min,max) 的示例

步骤 1:创建一个 CalculatorService 接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      calcService.serviceUsed();
      calcService.serviceUsed();
      calcService.serviceUsed();   
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().times(1,3);
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

至少一次的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      calcService.serviceUsed();
      calcService.serviceUsed(); 
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().atLeastOnce();
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

任意次数的示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
   public void serviceUsed();
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      calcService.serviceUsed();
      calcService.serviceUsed(); 
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test
   public void testAdd(){
      //add the behavior of calc service to add two numbers
      EasyMock.expect(calcService.add(10.0,20.0)).andReturn(30.00);
      calcService.serviceUsed();
      EasyMock.expectLastCall().anyTimes();
      
      //activate the mock
      EasyMock.replay(calcService);	
		
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac Calculator Service.java Math Application.java Math Application Tester.java Test Runner.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

EasyMock - 异常处理

EasyMock 提供了让 Mock 对象抛出异常的能力,因此可以测试异常处理。请看下面的代码片段。

//add the behavior to throw exception

EasyMock.expect(calc Service.add(10.0,20.0)).and Throw(new Runtime Exception("Add operation not implemented"));

在这里,我们向 Mock 对象添加了一个异常处理语句。MathApplication 使用 calcService 的 add 方法,并且当调用 calcService.add() 方法时,Mock 对象会抛出一个 RuntimeException。

示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;

// @RunWith attaches a runner with the test class to initialize the test data
@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   // @TestSubject annotation is used to identify class which is going to use the mock object
   @TestSubject
   MathApplication mathApplication = new MathApplication();

   //@Mock annotation is used to create the mock object to be injected
   @Mock
   CalculatorService calcService;

   @Test(expected = RuntimeException.class)
   public void testAdd(){
      //add the behavior to throw exception
      EasyMock.expect(calcService.add(10.0,20.0)).andThrow(
         new RuntimeException("Add operation not implemented")
      );
      //activate the mock
      EasyMock.replay(calcService);			
      
      //test the add functionality
      Assert.assertEquals(mathApplication.add(10.0, 20.0),30.0,0);
      
      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac MathApplicationTester.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

EasyMock - createMock

到目前为止,我们使用注解来创建 Mock 对象。EasyMock 提供了多种创建 Mock 对象的方法。EasyMock.createMock() 创建 Mock 对象,无需考虑 Mock 对象在其操作过程中将要调用的方法的顺序。

语法

calcService = EasyMock.createMock(CalculatorService.class);

示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

在这里,我们通过 expect() 向 Mock 对象添加了两个模拟方法调用,add() 和 subtract()。但是,在测试期间,我们在调用 add() 之前调用了 subtract()。当我们使用 EasyMock.createMock() 创建 Mock 对象时,方法的执行顺序无关紧要。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   private MathApplication mathApplication;
   private CalculatorService calcService;
   
   @Before
   public void setUp(){
      mathApplication = new MathApplication();
      calcService = EasyMock.createMock(CalculatorService.class);
      mathApplication.setCalculatorService(calcService);
   }
   @Test
   public void testAddAndSubtract(){
      //add the behavior to add numbers
      EasyMock.expect(calcService.add(20.0,10.0)).andReturn(30.0);
      
      //subtract the behavior to subtract numbers
      EasyMock.expect(calcService.subtract(20.0,10.0)).andReturn(10.0);
      
      //activate the mock
      EasyMock.replay(calcService);	
	
      //test the subtract functionality
      Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0);
      
      //test the add functionality
      Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
      
      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac MathApplicationTester.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true

EasyMock - createStrictMock

EasyMock.createStrictMock() 创建一个 Mock 对象,并同时处理 Mock 对象在其操作过程中将要调用的方法的顺序。

语法

calcService = EasyMock.createStrictMock(CalculatorService.class);

示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

在这里,我们通过 expect() 向 Mock 对象添加了两个模拟方法调用,add() 和 subtract()。但是,在测试期间,我们在调用 add() 之前调用了 subtract()。当我们使用 EasyMock.createStrictMock() 创建 Mock 对象时,方法的执行顺序很重要。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   private MathApplication mathApplication;
   private CalculatorService calcService;
   
   @Before
   public void setUp(){
      mathApplication = new MathApplication();
      calcService = EasyMock.createStrictMock(CalculatorService.class);
      mathApplication.setCalculatorService(calcService);
   }
   @Test
   public void testAddAndSubtract(){
      //add the behavior to add numbers
      EasyMock.expect(calcService.add(20.0,10.0)).andReturn(30.0);
      
      //subtract the behavior to subtract numbers
      EasyMock.expect(calcService.subtract(20.0,10.0)).andReturn(10.0);
      
      //activate the mock
      EasyMock.replay(calcService);	
	
      //test the subtract functionality
      Assert.assertEquals(mathApplication.subtract(20.0, 10.0),10.0,0);
      
      //test the add functionality
      Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
      
      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

C:\>EasyMock_WORKSPACE中创建一个名为 TestRunner 的 java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}  	

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac MathApplicationTester.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

testAddAndSubtract(com.tutorialspoint.mock.MathApplicationTester): 
   Unexpected method call CalculatorService.subtract(20.0, 10.0):
      CalculatorService.add(20.0, 10.0): expected: 1, actual: 0
false

EasyMock - createNiceMock

EasyMock.createNiceMock() 创建一个 Mock 对象,并为 Mock 对象的每个方法设置默认实现。如果使用 EasyMock.createMock(),则调用 Mock 方法会抛出断言错误。

语法

calcService = EasyMock.createNiceMock(CalculatorService.class);

示例

步骤 1:创建一个名为 CalculatorService 的接口来提供数学函数。

文件:CalculatorService.java

public interface CalculatorService {
   public double add(double input1, double input2);
   public double subtract(double input1, double input2);
   public double multiply(double input1, double input2);
   public double divide(double input1, double input2);
}

步骤 2:创建一个 JAVA 类来表示 MathApplication

文件:MathApplication.java

public class MathApplication {
   private CalculatorService calcService;
   public void setCalculatorService(CalculatorService calcService){
      this.calcService = calcService;
   }
   public double add(double input1, double input2){
      return calcService.add(input1, input2);		
   }
   public double subtract(double input1, double input2){
      return calcService.subtract(input1, input2);
   }
   public double multiply(double input1, double input2){
      return calcService.multiply(input1, input2);
   }
   public double divide(double input1, double input2){
      return calcService.divide(input1, input2);
   }
}

步骤 3:测试 MathApplication 类

让我们通过向其中注入 calculatorService 的模拟对象来测试 MathApplication 类。模拟对象将由 EasyMock 创建。

在这里,我们通过 expect() 添加了一个模拟方法调用 add()。但是,在测试期间,我们也调用了 subtract() 和其他方法。当我们使用 EasyMock.createNiceMock() 创建 Mock 对象时,可以使用具有默认值的默认实现。

文件:MathApplicationTester.java

import org.easymock.EasyMock;
import org.easymock.EasyMockRunner;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EasyMockRunner.class)
public class MathApplicationTester {
   private MathApplication mathApplication;
   private CalculatorService calcService;

   @Before
   public void setUp(){
      mathApplication = new MathApplication();
      calcService = EasyMock.createNiceMock(CalculatorService.class);
      mathApplication.setCalculatorService(calcService);
   }
   @Test
   public void testCalcService(){
      //add the behavior to add numbers
      EasyMock.expect(calcService.add(20.0,10.0)).andReturn(30.0);
      
      //activate the mock
      EasyMock.replay(calcService);	
      
      //test the add functionality
      Assert.assertEquals(mathApplication.add(20.0, 10.0),30.0,0);
      
      //test the subtract functionality
      Assert.assertEquals(mathApplication.subtract(20.0, 10.0),0.0,0);
      
      //test the multiply functionality
      Assert.assertEquals(mathApplication.divide(20.0, 10.0),0.0,0);		
      
      //test the divide functionality
      Assert.assertEquals(mathApplication.multiply(20.0, 10.0),0.0,0);

      //verify call to calcService is made or not
      EasyMock.verify(calcService);
   }
}

步骤 4:执行测试用例

在 **C:\> EasyMock_WORKSPACE** 创建一个名为 TestRunner 的 Java 类文件来执行测试用例。

文件:TestRunner.java

import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;

public class TestRunner {
   public static void main(String[] args) {
      Result result = JUnitCore.runClasses(MathApplicationTester.class);
      for (Failure failure : result.getFailures()) {
         System.out.println(failure.toString());
      }
      System.out.println(result.wasSuccessful());
   }
}

步骤 5:验证结果

使用javac编译器编译类,如下所示:

C:\EasyMock_WORKSPACE>javac MathApplicationTester.java

现在运行测试运行器以查看结果:

C:\EasyMock_WORKSPACE>java TestRunner

输出

验证输出。

true
广告
© . All rights reserved.