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