1

次のようなメソッドがあります。

public void myMethod(MyClass c)
{
  if (c == null)
  {
    return;
  }
  try
  {
    c.someMethod();
  }
  catch (SomeException e)
  {
    // log the exception, possibly re-throw
  }
}

MyClass パラメーター c のモック インスタンスをセットアップして、それ自体が null の値を返し、 c.someMethod() が呼び出されないようにする方法を見つけようとしています。私の単体テストは次のようになります。

@Test
public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Mockery mockery = new Mockery()
    {{
            setImposteriser(ClassImposteriser.INSTANCE);
    }};

    final MyClass mockMyClass = mockery.mock(MyClass.class);

    try
    {
        mockery.checking(new Expectations()
        {{
            oneOf(mockMyClass).equals(null);
                will(returnValue(true));

            never(mockMyClass).someMethod();
        }});
    }
    catch (Exception e)
    {
        logger.fatal(e);
        fail("Exception thrown in test.");
    }
    Util.myMethod(mockMyClass);
}

基本的に、私は MyClass のモック インスタンスを設定し、その値が null 値に対してテストされると true を返し、メソッド someMethod() が呼び出されないという期待を設定しています。

jMock は、Object クラス (equals(null) 部分) によって提供されるメソッドをオーバーライドすることはできないと述べているため、現在、テストは失敗しています。

jMockでこれを行う方法はありますか? このパターンは意味がありますか?これは有効なテストですか?そうでない場合、これをテストする方法について何か提案はありますか?

4

2 に答える 2

3

JMock だけを使用してこのコードをテストできるとは思いません。

直接渡してこれをテストしnullます。例外がスローまたはログに記録されない場合は、コードが期待どおりに機能したことがわかります。@Test

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    Util.myMethod(null);
    //no exception should be thrown.
}

より明示的にしたい場合は、myMethod(null)呼び出しを try/catch ブロックでラップできますが、失敗したときに失敗の理由を明確にする場合を除いて、これは必要ありません。

public void Test_myMethod_With_Null_MyClass_Does_Not_Call_someMethod()
{
    try
    {
        Util.myMethod(null);
    }
    catch( ExpectedException e )
    {
        fail( "Should not have thrown exception: " + e.getMessage() ); 
    }
}

cifはもちろん呼び出すことができないことがわかっているためnull、これは十分なテストです。c.something()

于 2009-05-10T04:45:32.023 に答える
1

モックは、オブジェクトがそのコラボレーターとどのように相互作用するかをテストするために使用されることになっています。共同作業者がいない場合は、モックするものは何もありません。nullを渡す方が簡単で、表現力があります。

于 2009-05-21T12:18:40.757 に答える