为什么测试“test_inputstream......”成功了,难道不应该是失败吗?

Why is the test "test_inputstream..." succeeding, shouldnt it be failing?

提问人:Jake Snell 提问时间:11/9/2023 更新时间:11/9/2023 访问量:32

问:

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 的新手,但我认为通过将我的输入流设置为自定义流,我可以模拟输入流。这是不正确的吗?我试图为我正在从事的项目设置一个模拟。我可能完全错了,我只是不确定。

测试 java.util.scanner inputstream junit5

评论

0赞 user207421 11/9/2023
Scanner sc = new Scanner(System.in)在构造对象时运行。 在那之后运行。此时,重新分配扫描仪输入为时已晚。init()

答:

0赞 tim-danger 11/9/2023 #1

我想您不能将“标准”输入流(即系统的输入)重新分配给您的模拟实现。但是,您可以创建自己的 Scanner 实例,该实例使用您的模拟(而不是“标准”输入流):

@Test
void test_inputstream_fails_on_mismatch() {
    sc = new Scanner(mockInputStream);
    assertEquals("quiffdt", sc.nextLine());
}

该测试失败。这是你想要的吗?