Рубрики
Без рубрики

Частичный макет EasyMock

Частичный макет EasyMock, конструктор частичного макета EasyMock, частичный конструктор макетов, с конструктором, с аргументами, addMockedMethods, пример частичного макета EasyMock.

Автор оригинала: 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 .