Camel 如何使用mockito模拟交换.getIn().getBody(HttpServletRespose.class)

pn9klfpd  于 2022-11-07  发布在  Apache
关注(0)|答案(3)|浏览(133)

我正在尝试用camel编写junit for file。
下面是我想模仿的servletResponse。
处理器:

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

ServletOutputStream servletOutputStream = servletResponse.getOutputStream();

IOUtils.copy(inputStream, servletOutputStream);

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

我已经尝试为此编写junit。
下面是模拟servletResponse的代码:

HttpServletResponse response = mock(HttpServletResponse.class);

ServletOutputStream outputStream = mock(ServletOutputStream.class);

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

但是我得到了处理器中的servletResponse的null。

ftf50wuq

ftf50wuq1#

你应该为exchange.getIn()message.getBody(HttpServletResponse.class)添加when(...)。我建议你使用@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
0tdrvxhp

0tdrvxhp2#

最好的解决方案是不使用exchange.getIn().getBody,因此没有义务模仿它

Processor interface使用起来有点笨拙,而且很难测试。因此,您可以使用简单的bean,它们易于使用和测试
您可以编写一个Java bean来免费注入消息正文,而不是编写一个调用exchange.getIn().getBody的处理器。请参阅Camel Docs for more Annotations to inject message parts into Beans
POJO中的此方法与您的处理器执行相同的操作。

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

您可以使用以下命令调用路线中的POJO

.bean(MyBean.class)

由于Inversion of control,测试这个bean非常容易。你不需要得到你的ServletResponse,它已经给你了。

jecbmhm3

jecbmhm33#

在游戏后期,但我也面临着类似的问题。下面的一些东西解决了我的问题。

when(exchange.getIn()).thenReturn(message);
when(exchange.getIn().getBody(HttpServletResponse.class)).thenReturn(response);

相关问题