Как имитировать веб-метод в Mockito

Я работаю над проектом Java, где мне нужно написать модульные тесты с помощью testng для класса, который имеет метод, аналогичный следующему:

public boolean isValidCode(String code) {
    // Some logic here
    return service.exists(new CodeInput(code));
}

Метод isValidCode вызывает существующий метод из интерфейса службы GenericService. Метод существует в GenericService отвечает за проверку существования кода. Проблема, с которой я столкнулся, заключается в том, что существует метод WebMethod, который я на самом деле не хочу вызывать.

Вот интерфейс GenericService:

@WebService(name = "GenericService", targetNamespace = "http://example.com/GenericService")
@SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.BARE)
@BindingType(javax.xml.ws.soap.SOAPBinding.SOAP12HTTP_BINDING)
@XmlSeeAlso({
    ObjectFactory.class
})
public interface GenericService {

    @WebMethod(operationName = "GenericExists", action = "http://example.com/GenericService/GenericExists")
    @WebResult(name = "GenericExistsResponse", targetNamespace = "http://example.com/GenericService", partName = "response")
    public GenericExists exists(
        @WebParam(name = "GenericExistsRequest", targetNamespace = "http://example.com/GenericService", partName = "CodeInput")
        CodeInput codeInput);
}

Есть ли способ высмеять метод существования в моем классе GenericService, чтобы он просто возвращал true при вызове? Я просто хочу протестировать «isValidCodeMethod» для своих тестов.

Я попытался использовать Mockito, чтобы сделать следующее:

CodeInput codeInput = mock(CodeInput.class);
GenericService serviceMock = mock(GenericService.class);
when(genericService.exists(any(CodeInput.class))).thenReturn(true);

Но когда я это делаю, я получаю исключение нулевого указателя.

Вы говорите о зарезервированном сокете/порте для tcp-транзакций?

Grim 03.06.2024 18:02

@Grim Нет, проблема не связана с зарезервированным сокетом/портом. Я пытаюсь выяснить, могу ли я использовать библиотеку WireMock для имитации конечных точек HTTP в целях тестирования. В моей среде разработки фактическая конечная точка веб-службы недоступна, поэтому я рассматриваю возможность настройки фиктивного сервера для имитации ответов веб-службы.

TechGoose 03.06.2024 18:10

Когда вы проводите модульное тестирование, вам не нужны конечные точки. Вы высмеиваете что-либо за пределами тестируемого метода(ов). Итак, код, который вы показали, мне кажется правильным для модульного теста. Чтобы помочь вам с NPE, нам нужно увидеть эту трассировку стека и другие фрагменты тестового кода.

cyberbrain 03.06.2024 18:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
82
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте использовать мошенник

https://www.mbtest.org/

очень прост в освоении, использовании и развертывании. предоставлять различные функции, такие как условный прокси. вы можете иметь частичные условные макеты, а все остальное также можно перенести на реальную службу/цель.

Ответ принят как подходящий

Убедитесь, что ваш YourClass имеет метод isValidCode и правильно внедрите GenericService.

import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.when;
import static org.testng.Assert.assertTrue;

public class YourClassTest {

    @Mock
    private GenericService genericService;

    @InjectMocks
    private YourClass yourClass;

    @BeforeMethod
    public void setUp() {
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void testIsValidCode() {
        // Arrange
        CodeInput codeInput = new CodeInput("testCode");
        when(genericService.exists(any(CodeInput.class))).thenReturn(new GenericExists(true));

        // Act
        boolean result = yourClass.isValidCode("testCode");

        // Assert
        assertTrue(result);
    }
}
  • @InjectMocks: внедряет макет GenericService в ваш класс.
  • MockitoAnnotations.initMocks(this): Инициализирует фиктивные объекты.

Огромное вам спасибо за это! Я забыл об использовании Inject Mocks, чтобы убедиться, что макеты были внедрены в объект, который я тестировал. Я очень ценю это.

TechGoose 04.06.2024 17:42

Другие вопросы по теме