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”和任何其他输入(对此问题应重复一次)。
如果您使用BufferedReader.readLine()
而不是担心字符,promptStringOrFile()
方法可能更清晰。
来源
2012-04-21 20:06:16
DNA
如果您打算发布链接的代码,[SSCCE](http://sscce.org)可能会让您的答案更快... – DNA 2012-04-21 20:13:07
您是对的,对不起,请在下面重新发布SSCCE。 – 2012-04-21 21:25:02
不幸的是,这不是自包含的(需要其他几个类,比如'Word'和'WordFrequency'),也没有正确的 - 'main'不会编译,因为它使用类型'bool'并调用未定义的方法'inputReadFailure' – DNA 2012-04-21 21:45:39