Как смоделировать exhange.getIn (). GetBody (HttpServletRespose.class) с помощью mockito - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь написать junit для файла на верблюде. ​​

Ниже servletResponse, который я хочу издеваться.

Процессор:

HttpServletResponse servletResponse = exchange.getIn().getBody(HttpServletResponse.class);

ServletOutputStream servletOutputStream = servletResponse.getOutputStream();

IOUtils.copy(inputStream, servletOutputStream);

servletOutputStream.flush(); 
servletOutputStream.close();

Я пыталсянапишите junit для этого.

Чтобы смоделировать ответ сервлета здесь ниже кода:

HttpServletResponse response = mock(HttpServletResponse.class);

ServletOutputStream outputStream = mock(ServletOutputStream.class);

when(response.getOutputStream()).thenReturn(outputStream);

Но я получаю нулевое значение для servletResponse, который находится в процессоре.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Лучшее решение состоит в том, чтобы не использовать exchange.getIn().getBody и, следовательно, не иметь никаких обязательств по его издевательству .

Интерфейс процессора немного неуклюж в использовании и его сложно протестировать. Поэтому вы можете использовать простые bean-компоненты, которые просты в использовании и тестировать .

Вместо написания Процессора, который вызывает exchange.getIn().getBody, вы можете написать Java-бин , которому бесплатно вводится тело сообщения . См. Camel Docs для получения дополнительных аннотаций для введения частей сообщения в Бины .

Этот метод в POJO делает то же самое, что и ваш процессор.

public void processServletResponse(@Body HttpServletResponse servletResponse) {
    servletResponse.setStatus(200);
    ...
}

Вы можете вызвать POJO по маршруту с помощью

.bean(MyBean.class)

Проверка этого компонента очень проста благодаря Инверсия управления . Вам не нужно получать ваш ServletResponse, он вам дан.

1 голос
/ 30 сентября 2019

Вы должны добавить when(...) для exchange.getIn() и message.getBody(HttpServletResponse.class). Я бы предложил использовать аннотации @RunWith(MockitoJUnitRunner.class) и @Mock. Посмотрите на тест:

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import static org.mockito.Mockito.when;

@RunWith(MockitoJUnitRunner.class)
public class MyExchangeServiceTest {
    private MyExchangeService testedObject = new MyExchangeService();

    @Mock
    private Exchange exchange;
    @Mock
    private HttpServletResponse response;
    @Mock
    private Message message;
    @Mock
    private ServletOutputStream outputStream;

    @Test
    public void servletResponseIsRead() throws Exception {
        when(exchange.getIn()).thenReturn(message);
        when(message.getBody(HttpServletResponse.class)).thenReturn(response);
        when(response.getOutputStream()).thenReturn(outputStream);

        testedObject.process(exchange);
    }
}

Обновление, вот мой сервис:

import org.apache.camel.Exchange;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

public class MyExchangeService {

    public void process(Exchange exchange) throws Exception {
        HttpServletResponse servletResponse = exchange.getIn().getBody(HttpServletResponse.class);

        servletResponse.setStatus(200);

        servletResponse.addHeader("Content-Type", "application/octet-stream");

        servletResponse.addHeader("Content-Disposition", "attachment;filename='xyz.csv'");

        ServletOutputStream servletOutputStream = servletResponse.getOutputStream();

        System.out.println(" servletOutputStream: " + servletOutputStream.getClass());
    }
}

Тестовый вывод:

 servletOutputStream: class org.mockito.codegen.ServletOutputStream$MockitoMock$501469028
...