JMock 希望您使用context.checking()
然后调用被测代码来声明期望,然后调用context.assertIsSatisfied()
(尽管有时如果使用适当的测试运行程序,最后一步是隐式完成的)。
您似乎context.assertIsSatisfied()
在运行任何代码之前立即调用。
mn
此外,您发布的代码使用了似乎未定义的变量- 这实际上是您正在运行的代码吗?还是应该mockIn
改为该变量?
更新:好的,问题可能是您正在尝试模拟静态方法 - JMock 不支持这一点 - 请参阅jmock mocking a static method。请特别参阅 JMock 的作者之一 Steve Freeman 的回答。
更新 2:我会尝试这样的事情,在 @Before 设置中设置期望:
@Before
public void setMinimalMockingExpectations() throws IOException
{
oldIn = System.in;
oldOut = System.out;
pipe = new PipedOutputStream();
testIn = new PipedInputStream(pipe);
mockOut = context.mock(PrintStream.class);
System.setOut(mockOut);
System.setIn(testIn);
expectQuestion();
}
private void expectQuestion()
{
Expectations exp = new Expectations()
{
{
one(mockOut).println(main.QUESTION);
}
};
context.checking(exp);
}
@After
public void reset()
{
System.setIn(oldIn);
System.setOut(oldOut);
}
@Test
public void fileChoiceReturnsFalse() throws IOException
{
String FILE = "F\n";
pipe.write(FILE.getBytes());
assertFalse(main.promptStringOrFile());
context.assertIsSatisfied(); // can avoid this call by using the right
// test runner
}
并创建两个类似的测试来检查输入“I”和任何其他输入的行为(问题应该重复一次)。
如果您使用而不是担心字符,该promptStringOrFile()
方法可能会更清晰。BufferedReader.readLine()