使用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("");
    }
}

Input和Output是实现控制台读写的接口。

My Error Message:

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",要么更改方法以打印您期望的内容。

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

您需要将此空格添加到期望的部分或更改您的函数。

相关内容

  • 没有找到相关文章

最新更新