14

私はさまざまなモッキング ライブラリの内外を学習しようとしていますが、PowerMock (具体的には EasyMock 拡張機能) は次のリストにあります。コンストラクターをモックしようとしていますが、提供されている例を複製しようとすると、同じ応答がありません。私が知る限り、コンストラクターをモックすることはなく、通常のように処理されます。

これはテストクラスです:

@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class})
public class FaultInjectionSituationTest {

    @Test
    public void testActionFail() throws Exception {
        FaultInjectionSituation fis = new FaultInjectionSituation();
        PowerMock.expectNew(Writer.class, "test")
           .andThrow(new IOException("thrown from mock"));
        PowerMock.replay(Writer.class);
        System.out.println(fis.action());
        PowerMock.verify(Writer.class);
    }

}

「テスト」を EasyMock.isA(String.class) に置き換えてみましたが、同じ結果が得られました。

これは FaultInjectionSituation です。

public class FaultInjectionSituation {

    public String action(){
        Writer w;
        try {
            w = new Writer("test");
        } catch (IOException e) {
            System.out.println("thrown: " + e.getMessage());
            return e.getLocalizedMessage();
        }
        return "returned without throw";
    }
}

「ライター」は、クラスのシェルにすぎません。

public class Writer {
    public Writer(String s) throws IOException {
    }

    public Writer() throws IOException{
    }
}

テストが実行されると、例外がスローされなかったことを示す「returned without throw」が出力されます。

4

2 に答える 2

27

コンストラクターを呼び出すクラスも準備する必要があるため、PowerMock はコンストラクター呼び出しのモックを予期することを認識します。次のようにコードを更新してみてください。

@RunWith(PowerMockRunner.class)
@PrepareForTest({Writer.class, FaultInjectionSituation.class})
public class FaultInjectionSituationTest { 
 // as before
}
于 2012-09-11T21:46:34.270 に答える
2

最初にモック オブジェクトを作成する必要があります。

Writer mockWriter = PowerMock.createMock(Writer.class)
PowerMock.expectNew(Writer.class, "test").andReturn(mockWriter)
于 2012-09-10T23:15:38.690 に答える