Как протестировать проект Maven с помощью EasyMock?

Опубликовано: 19 Февраля, 2023

Всегда программный проект готовится и тестируется как отдельная единица. Мы передаем разные сценарии и ожидаем, что исходные значения должны совпадать. Одним из таких подходов является «Easymock», и в этой статье в примере проекта рассматривается, когда и как имитировать методы void. Мы собираемся увидеть этот подход через проект maven. Следовательно, необходимо добавить зависимости в pom.xml.

<dependency>
    <groupId>org.easymock</groupId>
    <artifactId>easymock</artifactId>
    <version>4.0.2</version>
    <scope>test</scope>
</dependency>

пустой метод:

Обычно методы имеют тенденцию возвращать значение, и тестирование можно выполнить, передав значение и ожидая, что метод вернет это значение или нет. Если методы ничего не возвращают, то они называются недействительными методами, и в этих случаях основным фактором является то, требуется ли тестирование или нет. Но по сути требуется, как бы метод ничего не возвращал, в случае с Session.save() он создает новый ID в системе. Во время таких сценариев мы можем имитировать и тестировать зависимости. Прежде чем перейти к программам, давайте посмотрим на структуру проекта.

Начнем с pom.xml, который содержит все зависимости, необходимые для проекта.

Пример проекта Maven

пом.xml

XML




<?xml version="1.0" encoding="UTF-8"?>
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>    
    <artifactId>easymock</artifactId>
    <name>easymock</name>
    <url>http://maven.apache.org</url>
    <parent>
        <groupId>com.gfg</groupId>
        <artifactId>testing-modules</artifactId>
        <version>1.0.0-SNAPSHOT</version>
    </parent>
  
    <dependencies>
        <dependency>
            <groupId>org.easymock</groupId>
            <artifactId>easymock</artifactId>
            <version>${easymock.version}</version>
             <scope>test</scope
        </dependency>
    </dependencies>
  
    <properties>
    <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <easymock.version>4.0.2</easymock.version>
    </properties>   
  
</project>

Смоделируйте метод void или метод, который возвращает допустимый тип данных, и он должен быть доступен в интерфейсе.

Java




public interface WeatherServiceInterface {
    public BigDecimal  getLocationTemperature(GeoLocation geoLocation) ;
}

Если мы имитируем метод void, для возврата успеха необходимо указать значение return null . В противном случае, согласно возвращенному, мы можем это сделать. Полный код остальных java-файлов приведен ниже.

GeoLocation.java

Java




import java.math.BigDecimal;
  
public class GeoLocation {
      
    private String locationName;
    private BigDecimal minTemperature;
    private BigDecimal maxTemperature;
    
    @Override
    public String toString() {
        return "GeoLocation [locationName=" + locationName + ", minTemperature=" + minTemperature + ", maxTemperature="
                + maxTemperature + "]";
    }
    public GeoLocation(String locationName, BigDecimal minTemperature, BigDecimal maxTemperature) {
  
        this.locationName = locationName;
        this.minTemperature = minTemperature;
        this.maxTemperature = maxTemperature;
    }
    public String getLocationName() {
        return locationName;
    }
    public void setLocationName(String locationName) {
        this.locationName = locationName;
    }
    public BigDecimal getMinTemperature() {
        return minTemperature;
    }
    public void setMinTemperature(BigDecimal minTemperature) {
        this.minTemperature = minTemperature;
    }
    public BigDecimal getMaxTemperature() {
        return maxTemperature;
    }
    public void setMaxTemperature(BigDecimal maxTemperature) {
        this.maxTemperature = maxTemperature;
    }
    public GeoLocation(String locationName) {
        this.locationName = locationName;
    }
     
}

WeatherServiceInterface.java

Java




import java.math.BigDecimal;
  
public interface WeatherServiceInterface {
    public BigDecimal  getLocationTemperature(GeoLocation geoLocation);  
}

WeatherForecastProcessor.java

Java




import java.math.BigDecimal;
  
public class WeatherForecastProcessor {
    private WeatherServiceInterface weatherService;
  
    public BigDecimal getMaximumTemperature(GeoLocation location) {
        BigDecimal temperature = null;
        temperature = weatherService.getLocationTemperature(location);
  
        return temperature;
    }
  
    public WeatherServiceInterface getWeatherService() {
        return weatherService;
    }
  
    public void setWeatherService(WeatherServiceInterface weatherService) {
        this.weatherService = weatherService;
    }
  
}

WeatherServiceUnavailableException.java

Java




public class WeatherServiceUnavailableException extends Exception {
    private static final long serialVersionUID = 6961151537340723535L;
}

Тестовый файл

WeatherForecastProcessorUnitTest.java

Java




package com.gfg.easymocktesting;
  
import java.math.BigDecimal;
import org.easymock.EasyMock;
import org.junit.jupiter.api.Test;
import junit.framework.TestCase;
  
public class WeatherForecastProcessorUnitTest extends TestCase {
    
    private com.gfg.easymocktesting.WeatherForecastProcessor weatherForecastProcessor;
    private com.gfg.easymocktesting.WeatherServiceInterface mockWeatherServiceInterface;
    com.gfg.easymocktesting.GeoLocation location;
    BigDecimal temperature;
  
    @Test
    public void testGetMaximumTemperature() {
        weatherForecastProcessor = new WeatherForecastProcessor();
        mockWeatherServiceInterface = EasyMock.createMock(WeatherServiceInterface.class);
        location = new GeoLocation("London", new BigDecimal(10.00), new BigDecimal(100.00));
        weatherForecastProcessor.setWeatherService(mockWeatherServiceInterface);
        EasyMock.expect(mockWeatherServiceInterface.getLocationTemperature(location)).andReturn(temperature);
        EasyMock.replay(mockWeatherServiceInterface);
  
    }
}

Вывод выполнения JUnit Testcase

Вывод

На самом деле для имитации подключения к базе данных или свойств, полученных из файла, доступного локально или с сервера, не требуется. Easymock использовал концепцию отражения Java, и поэтому они использовали фиктивные объекты для данного интерфейса.