猿问

如何使用 PrintWriter 测试方法?

我有以下方法:


@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 将响应包装在其中。没有更多细节了,但似乎我必须创建一些单词才能通过验证:)


开满天机
浏览 243回答 3
3回答

忽然笑

你不需要 mockito 来测试这个方法,只需要一个java.io.StringWriter.以下是如何编写用于名义用途的测试:@Testvoid status_written_in_csv_format() {    // Setup    WriteCsvToResponse objectUnderTest = new WriteCsvToResponse ();    StringWriter stringWriter = new StringWriter();    PrintWriter printWriter = new PrintWriter(stringWriter);    // Given    Status status = ...    // When    objectUnderTest.writeStatus(printWriter, status);    // Then    String actualCsv = stringWriter.toString();    assertThat(actualCsv.split("\n"))       .as("Produced CSV")       .containsExactly(         "id,storeId,status",         "42,142,OK");}这个例子假设了一些关于你的Status对象的事情,但你有一般的想法。对于断言,我使用AssertJ,但您可以使用 JUnit5 内置断言执行相同操作。

RISEBY

您可以编写这样的测试并更改 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    }

撒科打诨

稍微重构一下,其中 Builder 是注入到该组件中的 Spring Bean。然后,您可以模拟该构建器以返回模拟的 StatefulBeanToCsv,特别是 write 方法,您可以在其中编写条件和断言。如果遇到错误,则抛出一些未经检查的异常,例如 IllegalStateException,如果一切正常,则不抛出任何内容
随时随地看视频慕课网APP

相关分类

Java
我要回答