Я работаю над проектом 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);
Но когда я это делаю, я получаю исключение нулевого указателя.
@Grim Нет, проблема не связана с зарезервированным сокетом/портом. Я пытаюсь выяснить, могу ли я использовать библиотеку WireMock для имитации конечных точек HTTP в целях тестирования. В моей среде разработки фактическая конечная точка веб-службы недоступна, поэтому я рассматриваю возможность настройки фиктивного сервера для имитации ответов веб-службы.
Когда вы проводите модульное тестирование, вам не нужны конечные точки. Вы высмеиваете что-либо за пределами тестируемого метода(ов). Итак, код, который вы показали, мне кажется правильным для модульного теста. Чтобы помочь вам с NPE, нам нужно увидеть эту трассировку стека и другие фрагменты тестового кода.
Попробуйте использовать мошенник
очень прост в освоении, использовании и развертывании. предоставлять различные функции, такие как условный прокси. вы можете иметь частичные условные макеты, а все остальное также можно перенести на реальную службу/цель.
Убедитесь, что ваш 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);
}
}
Огромное вам спасибо за это! Я забыл об использовании Inject Mocks, чтобы убедиться, что макеты были внедрены в объект, который я тестировал. Я очень ценю это.
Вы говорите о зарезервированном сокете/порте для tcp-транзакций?