Автор оригинала: Pankaj Kumar.
EasyMock поддерживает создание частичного макета, где мы можем указать методы, над которыми будут издеваться. Если будет вызван какой-либо другой метод, будет вызван реальный метод объекта.
Пример Частичного макета EasyMock
Допустим, у нас есть служебный класс, определенный как:
package com.journaldev.utils;
public class StringUtils {
public void print(String s) {
System.out.println(s);
}
public String toUpperCase(String s) {
return s.toUpperCase();
}
}
Мы хотим издеваться над прописными буквами() методом, но не методом печати () . Для этого мы можем использовать метод partial MockBuilder () . Нам также придется использовать addMockedMethod () , чтобы предоставить список методов, над которыми будут издеваться.
package com.journaldev.easymock;
import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import org.junit.jupiter.api.Test;
import com.journaldev.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);
}
}
Если вы хотите имитировать несколько методов в частичном макете, используйте addmockedmethod() с именами методов в качестве аргумента.
Конструктор частичного макета EasyMock
Мы также можем вызвать конструктор класса при создании частичного макета. Это полезно, когда реальные методы используют некоторые свойства, заданные через конструктор.
Для вызова частичного макетного конструктора мы можем использовать метод with Constructor() и withArgs () . Существует несколько перегруженных с помощью методов конструктора (), выберите тот, который соответствует вашим требованиям к конструктору класса.
Допустим, у нас есть класс данных, определенный как:
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.journaldev.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);
}
}
Резюме
Частичный макет EasyMock полезен, когда мы заинтересованы в тестировании только нескольких методов класса. Это очень похоже на создание частичного макета в Mockito с помощью Mockito Spy .