EasyMock部分模拟

时间:2020-02-23 14:41:18  来源:igfitidea点击:

EasyMock支持创建部分模拟,我们可以其中指定将被模拟的方法。
如果调用任何其他方法,则将调用对象实型方法。

EasyMock部分模拟示例

假设我们有一个定义为的实用程序类:

package com.theitroad.utils;

public class StringUtils {

	public void print(String s) {
		System.out.println(s);
	}

	public String toUpperCase(String s) {
		return s.toUpperCase();
	}
}

我们要模拟toUpperCase()方法,而不是print()方法。
我们可以使用partialMockBuilder()方法来实现。
我们还必须使用addMockedMethod()提供要模拟的方法列表。

package com.theitroad.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.api.Test;

import com.theitroad.utils.StringUtils;

public class EasyMockPartialMockingExample {

@Test
public void test() {
  StringUtils mock = partialMockBuilder(StringUtils.class)
        .addMockedMethod("toUpperCase").createMock();
  
  expect(mock.toUpperCase("java")).andReturn("JAVA");
  replay(mock);
      
  //real method will be called, check the console
  mock.print("java");
  
  //testing mocked method
  assertEquals("JAVA", mock.toUpperCase("java"));
  verify(mock);
}
}

如果要模拟部分模拟中的多个方法,请使用" addMockedMethods()",并将方法名称作为参数。

EasyMock部分模拟构造函数

在创建部分模拟时,我们也可以调用类构造函数。
当实际方法使用通过构造函数设置的某些属性时,这很有用。

为了调用部分模拟构造器,我们可以使用withConstructor()withArgs()方法。
有多个重载的withConstructor()方法,请选择一种适合您的类构造函数要求的方法。

假设我们将Data类定义为:

class Data {
private String message;
private String encodedMsg;

public Data(String msg) {
  this.message = msg;
}
public void print() {
  System.out.println("Message is: "+this.message);
}
public String encode() {
  this.encodedMsg = Base64.getEncoder().encodeToString(this.message.getBytes());
  return encodedMsg;
}
public String decode() {
  return String.valueOf(Base64.getDecoder().decode(encodedMsg));
}
}

我们只想模拟decode()方法。
但是由于print()和encode()方法使用的是通过构造函数设置的对象属性,因此我们将不得不创建部分模拟并调用其构造函数。

package com.theitroad.easymock;

import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;

import java.util.Base64;

import org.junit.jupiter.api.Test;

public class EasyMockPartialMockConstructorExample {

@Test
public void test() {
  Data mock = partialMockBuilder(Data.class)
        .withConstructor(String.class)
        .withArgs("Hello")
        .addMockedMethods("decode")
        .createMock();
  //calling real methods
  mock.print();
  String encodedMessage = mock.encode();
  System.out.println(encodedMessage);
  assertEquals(Base64.getEncoder().encodeToString("Hello".getBytes()), mock.encode());
  
  //mock some behaviors
  expect(mock.decode()).andReturn("Hello");
  replay(mock);
  assertEquals("Hello", mock.decode());
  
  verify(mock);
}
}