JMock は、Expectations を使用して宣言し、テスト対象のコードを呼び出してcontext.checking()
から呼び出すことを期待していますcontext.assertIsSatisfied()
(ただし、適切なテスト ランナーを使用している場合、最後のステップが暗黙的に実行されることがあります)。
context.assertIsSatisfied()
コードを実行する前にすぐに呼び出しているようです。
また、投稿したコードは、mn
定義されていないように見える変数を使用しています-それは実際に実行しているコードですか? mockIn
それとも、代わりにその変数を使用する必要がありますか?
更新: OK、問題はおそらく静的メソッドをモックしようとしていることにあります - JMock はこれをサポートしていません - jmock mocking a static method を参照してください。特に、JMock の作成者の 1 人である 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」とその他の入力(質問を1回繰り返す必要がある場合)の動作をチェックする2つの同様のテストを作成します。
文字を気にするよりも、使用したpromptStringOrFile()
方がメソッドはおそらくより明確です。BufferedReader.readLine()