Как протестировать проект Maven с помощью EasyMock?
Всегда программный проект готовится и тестируется как отдельная единица. Мы передаем разные сценарии и ожидаем, что исходные значения должны совпадать. Одним из таких подходов является «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 < modelVersion >4.0.0</ modelVersion > < artifactId >easymock</ artifactId > < name >easymock</ name > < 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, и поэтому они использовали фиктивные объекты для данного интерфейса.