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);
}
}

