提问人:Jake Snell 提问时间:11/9/2023 更新时间:11/9/2023 访问量:32
为什么测试“test_inputstream......”成功了,难道不应该是失败吗?
Why is the test "test_inputstream..." succeeding, shouldnt it be failing?
问:
package com.skilldistillery.lordo.app;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
class UITest {
Scanner sc = new Scanner(System.in);
InputStream mockInputStream;
@BeforeEach
void init() {
// This will run once before any of the test methods in the class.
mockInputStream = new MockInputStream();
System.setIn(mockInputStream);
}
@Test
void test_inputstream_fails_on_mismatch() {
assertEquals("quiffdt", sc.nextLine());
}
}
class MockGame implements CLIGame {
@Override
public void pushEvent(GameEvent event) {}
}
class MockInputStream extends InputStream {
private byte[] inputBytes;
private int position = 0;
public MockInputStream() {
String input = "quit" + System.lineSeparator();
this.inputBytes = input.getBytes();
}
@Override
public int read() throws IOException {
if (position < inputBytes.length) {
return inputBytes[position++];
} else {
return -1;
}
}
@Override
public void close() throws IOException {
super.close();
}
}
我真的是 java 的新手,但我认为通过将我的输入流设置为自定义流,我可以模拟输入流。这是不正确的吗?我试图为我正在从事的项目设置一个模拟。我可能完全错了,我只是不确定。
答:
0赞
tim-danger
11/9/2023
#1
我想您不能将“标准”输入流(即系统的输入)重新分配给您的模拟实现。但是,您可以创建自己的 Scanner 实例,该实例使用您的模拟(而不是“标准”输入流):
@Test
void test_inputstream_fails_on_mismatch() {
sc = new Scanner(mockInputStream);
assertEquals("quiffdt", sc.nextLine());
}
该测试失败。这是你想要的吗?
评论
Scanner sc = new Scanner(System.in)
在构造对象时运行。 在那之后运行。此时,重新分配扫描仪输入为时已晚。init()