0

この投稿は次のようなものです:これ

ユーザー入力と応答性の高いユーザー出力の両方を期待するコンソール アプリがあります。コードが正しく機能することを確認するために、いくつかの単体テストを作成しています。そのための出力と入力が期待どおりであることを確認できる必要があります。

基本的に、ファイルまたは入力を要求する main メソッドをテストしています。私のテストでは、 と を使用System.setOutSystem.setInて、それらをそれぞれ PrintStream オブジェクトと InputStream オブジェクトの context.mock バージョンに設定します。System.out.println結果をコンソールに出力するときに、プログラム データの実際の処理をテストする必要があるまで、どのような呼び出しが行われるかは気にしません。要約すると:

テスト中のソースは次のとおりです (かなり近いものを大幅に削除しました): http://ideone.com/rptC0

これが私のモック手順の内容です: http://ideone.com/VkvqM

そして、ここに私が得ている例外があります: ideone.com/OEOS8

私の予想ではっきりとわかるように、私はまったく同じ文字列を出力することを計画していたと明示的に言っており、それを私の予想で指定しました。しかし、例外はそれが予想外だったと言っています。理解できない...

4

1 に答える 1

0

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()

于 2012-04-21T20:06:16.580 に答える