JUnit & Mockito - thenReturn возвращает ноль при использовании на WebServiceTemplate - PullRequest
0 голосов
/ 02 марта 2020

Я использую Mochito и не могу вернуть ложный ответ для вызова API, который выполняется с помощью marshalSendAndReceive.

Здесь приведен вызов API службы (где serviceRequest имеет тип ValidateRequst, а HeaderComposingCallback реализует WebServiceMessageCallback)

public class ValidateClient extends WebServiceGatewaySupport {
   ...
    ValidateResponse serviceResponse = (ValidateResponse) getWebServiceTemplate().marshalSendAndReceive(
                serviceRequest, new HeaderComposingCallback(reqId));
   ..
}

Вот Mock в тесте JUnit, validateResponse - объект, созданный имеет заполненные значения, но во время выполнения модульного теста ниже код всегда возвращает нулевой ответ.

@RunWith(MockitoJUnitRunner.class)
public class ValidateServiceTest {
    @Mock
    WebServiceTemplate template;
    ....    
    when(template.marshalSendAndReceive(any(ValidateRequest.class),(WebServiceMessageCallback) any(HeaderComposingCallback.class))).thenReturn(validateResponse);
    ..
}

Ожидается получение validateResponse, который не является нулевым объектом.

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

Чтобы найти причину, мы должны увидеть метод getWebServiceTemplate() Но определенно проблема с ним (вы вызываете не marshalSendAndReceive() из template экземпляра, определенного как поле в тестовом классе, а из экземпляра из метода getWebServiceTemplate). Вы можете попытаться высмеять это:

@RunWith(MockitoJUnitRunner.class)
public class ValidateServiceTest {
    @Spy
    ValidateService validateService;
    @Mock
    WebServiceTemplate template;
    ....    
    when(validate.getWebServiceTemplate()).thenReturn(template);
    when(template.marshalSendAndReceive(any(ValidateRequest.class),(WebServiceMessageCallback) any(HeaderComposingCallback.class))).thenReturn(validateResponse);
    ..
}
0 голосов
/ 02 марта 2020

WebServiceGatewaySupport создает новый экземпляр WebServiceTemplate в своем конструкторе.

Убедитесь, что вы вызвали:

public final void setWebServiceTemplate(WebServiceTemplate webServiceTemplate)

, чтобы вставить свой макет в WebServiceGatewaySupport

...