繁体   English   中英

使用Mockito的模拟控制台

[英]Mocking console using mockito

我正在使用printBooks操作类从图书馆打印书籍清单。 我想看看是否将正确的输出写入控制台。 到目前为止,这是我尝试过的。 有人可以在这里解释我做错了什么吗? 提前致谢。

PrintBooksOperation.java

package tw51.biblioteca.io.menu;

import tw51.biblioteca.Lendable;
import tw51.biblioteca.Library;
import tw51.biblioteca.io.Input;
import tw51.biblioteca.io.Output;
import tw51.biblioteca.io.menu.home.MenuOptions;

import java.util.List;

import static tw51.biblioteca.ItemType.Book;

/**
 * Prints the Items Of Type Book.
 */

public class PrintBooksOperation implements MenuOptions {

    private Library library;
    private Output writer;

    @Override
    public void execute(Library library, Input reader, Output writer) {
        this.library = library;
        this.writer = writer;
        printBooks();
    }

    private void printBooks() {
        writer.formattedHeadings();
        writer.write("\n");
        List<Lendable> items = library.listItems();
        items.stream().filter(item -> item.isOfType(Book)).forEach(item -> {
            writer.write("\n" + item.toFormattedString());
        });
    }
}

PrintBooksOperationTest.java

    package tw51.biblioteca.io.menu;

import org.junit.Test;
import tw51.biblioteca.Book;
import tw51.biblioteca.Library;
import tw51.biblioteca.io.Input;
import tw51.biblioteca.io.Output;

import java.util.Arrays;
import java.util.LinkedList;

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;

/**
 *
 */
public class PrintBooksOperationTest {

    @Test
    public void areTheBooksPrintedCorrectly() {
        Input reader = mock(Input.class);
        Output writer = mock(Output.class);
        Book book = new Book("nin", "#123", "ghy", 2003);
        Library library = new Library(new LinkedList<>(Arrays.asList(book)));
        PrintBooksOperation print = new PrintBooksOperation();
        print.execute(library, reader, writer);
        verify(writer).write("");
    }
}

输入和输出是实现控制台读取和写入的接口。

我的错误讯息:

Argument(s) are different! Wanted:
output.write(
    ""
);
-> at tw51.biblioteca.io.menu.PrintBooksOperationTest.areTheBooksPrintedCorrectly(PrintBooksOperationTest.java:28)
Actual invocation has different arguments:
output.write(
    "
"
);

为什么实际参数为空? 当我运行它时,Printoperation可以工作。 我做错了什么吗? 还是有另一种方法来测试控制台?

错误消息指出实际函数调用返回额外的空格(注意引号在不同的行上),而您的“期望”值是一个空字符串( "" )。

您需要将此空白添加到期望的部分或更改功能。

当您在writer实例上调用verify时,表示您应使用参数“”首次调用它。

从您的实现,但是您多次写

private void printBooks() {
        writer.formattedHeadings();
        writer.write("\n"); // <-- This is the first time
        List<Lendable> items = library.listItems();
        items.stream().filter(item -> item.isOfType(Book)).forEach(item -> {
            writer.write("\n" + item.toFormattedString());
        });
    }

请注意,第一次调用write时,参数实际上是"\\n" ,这是一个换行符,该参数不匹配并且为空字符串,并且测试失败。 更改测试以检查“ \\ n”,或更改方法以打印所需的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM