0

以下がテストする必要があるクラスだとしましょう

public class ClassToTest{
//some code
    SomeOtherClass soc = new SomeOtherClass();
    Object returnedObject = soc.doMethodCall(passedObject);
}

実際の doMethodCall を発生させたくないので、それをモックして自分の値を返す必要があります。

mytest クラスでは、SomeOtherClass のテストの準備を追加します

@PrepareForTest({ SomeOtherClass.class})

私は次のように嘲笑をしました。

SomeOtherClass mockSoc = EasyMock.createMock(SomeOtherClass.class);
Easymock.expect(mockSoc.doMethodCall((ParamClass)EasyMock.anyObject())).andReturn(null);
EasyMock.replayAll();

問題は、メソッド呼び出しが発生せず、単体テストが doMetodCall(これは望ましくありません) に入り、null ポインター エラーを生成するのではなく、メソッド呼び出しをインターセプトして null を返すことです。

私が間違っていること。

4

1 に答える 1

0

編集

この質問に対する私の最初の答えは正しいですが、その理由は本当に具体的です。PowerMock をさらに読んで使用した後、私はこの問題に何度か遭遇しました。あなたが直面している問題は、テストの準備が必要なクラスが、構築をモックしているクラスではなく、テストしているクラスであるためです。

したがって、問題を解決するには、次のように変更@PrepareForTest({ SomeOtherClass.class})します@PrepareForTest({ ClassToTest.class})

編集終了


私は最近 PowerMock について調べていて、このページに出くわしました: PowerMock でオブジェクトのインスタンス化をモックする方法

私は自分でいくつかのクラスを作成するシナリオをテストしました。したがって、シナリオをテストするために作成したテストクラスは次のとおりです。

public class Class2 {
    public Object doMethodCall(final Object passedObject) {
        return passedObject.toString();
    }
}

public class Class1 {
    public Object method(final Object passedObject) {
        final Class2 class2 = new Class2();
        return class2.doMethodCall(passedObject);
    }
}

そのページのアドバイスを使用して、正常に実行され、メソッドが新しいインスタンスで呼び出されたことをテストする次のテスト メソッドを作成しました。

@RunWith(PowerMockRunner.class)
@PrepareForTest(Class1.class)
public class Class1Test {

    @Test
    public void testMethod() throws Exception {
        final Object passedObject = new Object();
        final Class2 mockClass2 = PowerMock.createMock(Class2.class);

        PowerMock.expectNew(Class2.class).andReturn(mockClass2);
        EasyMock.expect(mockClass2.doMethodCall(passedObject)).andReturn("YEAH!");

        PowerMock.replay(mockClass2, Class2.class);

        final Class1 class1 = new Class1();
        final Object returnedValue = class1.method(passedObject);
        Assert.assertEquals(returnedValue.toString(), "YEAH!");

        PowerMock.verify(mockClass2, Class2.class);
    }
}
于 2014-06-02T09:44:59.510 に答える