为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 PrintWriter 测试方法?

如何使用 PrintWriter 测试方法?

开满天机 2021-09-12 20:35:52
我有以下方法:@Componentpublic 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 将响应包装在其中。没有更多细节了,但似乎我必须创建一些单词才能通过验证:)
查看完整描述

3 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

你不需要 mockito 来测试这个方法,只需要一个java.io.StringWriter.


以下是如何编写用于名义用途的测试:


@Test

void 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 内置断言执行相同操作。


查看完整回答
反对 回复 2021-09-12
?
RISEBY

TA贡献1856条经验 获得超5个赞

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

    }


查看完整回答
反对 回复 2021-09-12
?
撒科打诨

TA贡献1934条经验 获得超2个赞

稍微重构一下,其中 Builder 是注入到该组件中的 Spring Bean。

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


查看完整回答
反对 回复 2021-09-12
  • 3 回答
  • 0 关注
  • 242 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信