使用 mockito 模拟控制台
Mocking console using mockito
我正在使用 printBooks 操作打印图书馆的图书列表 class。我想看看是否将正确的输出写入控制台。
到目前为止,这是我尝试过的。有人可以解释我在这里做错了什么吗?提前致谢。
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是实现console读写的接口。
我的错误信息:
Argument(s) are different! Wanted:
output.write(
""
);
-> at tw51.biblioteca.io.menu.PrintBooksOperationTest.areTheBooksPrintedCorrectly(PrintBooksOperationTest.java:28)
Actual invocation has different arguments:
output.write(
"
"
);
为什么实际参数为空?打印操作在我 运行 时起作用。我做错了什么吗?或者还有另一种测试控制台的方法吗?
错误消息说实际的函数调用返回额外的空格(注意引号在不同的行),而您的 "expected" 值是一个空字符串 (""
)。
您需要将此空格添加到您期望的部分或更改您的函数。
当您在 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”,要么更改方法以打印您期望的内容。
我正在使用 printBooks 操作打印图书馆的图书列表 class。我想看看是否将正确的输出写入控制台。 到目前为止,这是我尝试过的。有人可以解释我在这里做错了什么吗?提前致谢。
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是实现console读写的接口。
我的错误信息:
Argument(s) are different! Wanted:
output.write(
""
);
-> at tw51.biblioteca.io.menu.PrintBooksOperationTest.areTheBooksPrintedCorrectly(PrintBooksOperationTest.java:28)
Actual invocation has different arguments:
output.write(
"
"
);
为什么实际参数为空?打印操作在我 运行 时起作用。我做错了什么吗?或者还有另一种测试控制台的方法吗?
错误消息说实际的函数调用返回额外的空格(注意引号在不同的行),而您的 "expected" 值是一个空字符串 (""
)。
您需要将此空格添加到您期望的部分或更改您的函数。
当您在 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”,要么更改方法以打印您期望的内容。