1

次のようなクラスがあります。

class A
{
   public method doSomething()
   {
      //....

      DAO dataAccessor = new DAO();
      List<Object> result1 = dataAccessor.getData(dataAccessor.getSql1());
      List<Object> result2 = dataAccessor.getData(dataAccessor.getSql2());

      //.. do some stuff with the results

}

ここで、クラスをモックして、上記の関数をテストするためにjMockitを使用しますDAO

これは私のテストクラスがどのように見えるかです:

class A_Test
{
    private A myAClass;

    @Mocked DAO mockedDAO;

    List<Object> resultToSql1, resultToSql2;

    // ... Some initializations...

    @Test
    public void testDoSomething()
    {
        new NonStrictExpectations()
        {
                mockedDAO.getSql1(); result = "SQL1";
                mockedDAO.getData(withEqual("SQL1")); result = resultToSql1;

                mockedDAO.getSql2(); result = "SQL2";
                mockedDAO.getData(withEqual("SQL2")); result = resultToSql2;
        };

        myAClass.doSomething(); 
    }
}

さて、最初のマスクに関する2番目の期待値getData()、つまりモックオブジェクトは、期待値の最初の行(処理する行sql1)を宣言したことがないかのように動作するようです。

の最初の呼び出しgetData()は、初期化した値の代わりに、空のコレクションを返しますresultToSql1。2番目の呼び出しはresultToSql2、期待どおりに戻ります。

次の行にコメントすると:

mockedDAO.getData(withEqual("SQL2")); result = resultToSql2;

最初の呼び出しは私が定義したものを返します- resultToSql1、2番目の呼び出しは空のコレクションを返します。意味あり。

だから、私は何が間違っているのですか?getData()呼び出しのパラメーターに基づいて、から2つの異なる戻り値を定義するにはどうすればよいですか?

どんな助けでもいただければ幸いです。

ありがとう!

4

1 に答える 1

3

したがって、マニュアルをさらに深く掘り下げた後、私は次のことを発見しました。

...しかし、テストが再生時に受け取る引数に基づいて、記録された呼び出しの結果を決定する必要がある場合はどうなりますか?インスタンスを介してそれを行うことができmockit.Delegateます...

したがって、上記の問題を解決するには、expectationsブロックは次のようになります。

    new NonStrictExpectations()
    {
            mockedDAO.getSql1(); result = "SQL1";
            mockedDAO.getSql2(); result = "SQL2";

            mockedDAO.getData(anyString);
            result = new mockit.Delegate()
            {
                List<Object> getData(String sql)
                {
                    if (sql.equals("SQL1"))
                        return resultToSql1;
                    if (sql.equals("SQL2"))
                        return resultToSql2;
                    return null;
                }
            }
    };
于 2011-06-01T18:08:43.380 に答える