1

私はモッククラスの作成にかなり慣れていません。以下のメソッドのテストクラスを作成しようとしていますが、メソッド呼び出し「getSsnValue」のモックを続行できません。

public void setFieldValue(String fieldValue) {
    final Field<String> SSN = getSsnField(fieldValue);

    if (SSN !=null) {       
        getSsnValue(SSN ,fieldValue);
    }
}

以下は、メソッド「getSsnField」をモックするために作成されたテストであり、正常に機能しています。voidメソッド「getSsnValue」をモックして、呼び出し中にこのメソッドが実行されないようにする方法を理解するのに役立つ人はいますか? 「」

コードスニペット:

controller = EasyMock.createMockBuilder(Controller.class).addMockedMethod("getSsnField",String.class).createMock(); 
EasyMock.expect(controller.getSsnField((String)EasyMock.anyObject())).andReturn(SSN).anyTimes();                
EasyMock.replay(controller);           
controller.setFieldValue(name);
4

1 に答える 1

1

これらのメソッドは、テストでは実行できない重い作業を行うため、それらのメソッドを嘲笑していますか? 私が尋ねる理由は、IMO、同じクラスに存在するメソッドへの呼び出しをモックするためにこのような部分モックを作成する必要がある場合、おそらくあまりにも細かいレベルでテストしているからです。つまり、これらのメソッドをモック化する必要が本当にあるのでしょうか?

また、これらの内部メソッドをモックアウトしたい場合、テストの唯一の理由は、getSsnField(fieldValue) が Field を返す場合、getSsnValue() が同じ fieldValue で呼び出されることを確認することであると仮定します。

その道を進みたい場合は、次のことを行う必要があります。EasyMock では、void メソッドをモックアウトするために、expect(...); を使用しません。代わりに、(replay() を呼び出す前に) モック オブジェクトでメソッドを直接呼び出すだけです。そうすることで、その void メソッドが呼び出されるという期待を作成するように EasyMock に指示します。

Controller controller = EasyMock.createMockBuilder(Controller.class)
    .addMockedMethod("getSsnField", String.class)//
    .addMockedMethod("getSsnValue")//
    .createMock();
Field<String> SSN = new Field<String>();
String name = "name";
EasyMock.expect(controller.getSsnField(name)).andReturn(SSN).anyTimes();
// Just calling the getSsnValue method on the mock sets up the expectation
// that it must be called
controller.getSsnValue(SSN, name); // Mocking void method here
EasyMock.replay(controller);
controller.setFieldValue(name);

// This step is needed in order to enforce that all mocked methods were
// actually called.
EasyMock.verify(controller);
于 2013-03-13T15:49:32.167 に答える