如何使用PrintWriter测试方法?

时间:2018-09-11 11:35:32

标签: java csv mockito

我有以下方法:

@Component
public class WriteCsvToResponse {

    private static final Logger LOGGER = LoggerFactory.getLogger(WriteCsvToResponse.class);

    public void writeStatus(PrintWriter writer, Status status) {

        try {

            ColumnPositionMappingStrategy mapStrategy
                = new ColumnPositionMappingStrategy();

            mapStrategy.setType(Status.class);

            String[] columns = new String[]{"id", "storeId", "status"};
            mapStrategy.setColumnMapping(columns);

            StatefulBeanToCsv btcsv = new StatefulBeanToCsvBuilder(writer)
                .withQuotechar(CSVWriter.NO_QUOTE_CHARACTER)
                .withMappingStrategy(mapStrategy)
                .withSeparator(',')
                .build();

            btcsv.write(status);

        } catch (CsvException ex) {

            LOGGER.error("Error mapping Bean to CSV", ex);
        }
    }

我不知道如何使用mockito对其进行正确的测试。

使用它可以将对象状态包装为csv格式。 我使用StringWriter将响应包装在其中。 没有更多的细节了,但是看来我必须创建一些单词才能通过验证:)

2 个答案:

答案 0 :(得分:1)

经过一些重构,其中Builder是注入到该组件中的Spring Bean。

然后,您可以模拟该构建器以返回模拟的StatefulBeanToCsv,特别是write方法,您可以在其中编写条件和断言。如果遇到错误,则会抛出一些未经检查的异常,例如IllegalStateException,如果一切正常,则不会抛出任何东西

答案 1 :(得分:1)

您可以编写这样的测试,并在write方法中更改输入:

    @Test
    public void test() {
        WriteCsvToResponse writeCsvToResponse = mock(WriteCsvToResponse.class);

        doAnswer(new Answer() {
            public Object answer(InvocationOnMock invocation) {
                Object[] args = invocation.getArguments();
                write((Status)args[1]);
                return null;
            }
        }).when(writeCsvToResponse).writeStatus(any(PrintWriter.class),any(Status.class));

        writeCsvToResponse.writeStatus(writer, status);
    }

    public void write(Status status) {
//      do anythings you like with status
    }