2

powermockを使用してパブリック関数呼び出しの戻りをモックできないようです。

誰か助けてくれませんか?

失敗した行は

PowerMockito.doReturn(aa).when(B.class, B.class.getDeclaredMethod("getA"));

特に" when"メソッド内

コード:

import static org.junit.Assert.fail;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class PowermockTest {

    private static class A {

        private int number;

        public A(int number) {
            this.number = number;
        }

        public int getNumber() {
            return number;
        }
    }

    private static class B {

        private int number;
        private A a;

        public B(int number) {
            this.number = number;
        }

        public A getA() {
            if (a == null) {
                a = new A(number);
            }
            return a;
        }
    }

    @Test
    public void testOdrService() {
        A aa = PowerMockito.mock(A.class);
        try {
            B bb = new B(3);
            PowerMockito.doReturn(aa).when(B.class, B.class.getDeclaredMethod("getA"));
        } catch (Exception e) {
            fail("Exception in test. " + e.getMessage());
        }
    }

}

PS:

コードを次のように変更すると機能しますが、不要なダミーオブジェクトの作成を強制されます

B bb = new B(3);
B bb1 = PowerMockito.spy(bb);
PowerMockito.doReturn(aa).when(bb1).getA();
A mockedA = bb1.getA();
4

1 に答える 1

5
PowerMockito.doReturn(aa).when(B.class, B.class.getDeclaredMethod("getA"));

この構文は、静的メソッドをモックするためのものであり、のようなインスタンスメソッドをモックするためのものではありませんgetA()

ほとんどの場合、元の(スパイされた)オブジェクトを保持する必要はありません。スパイと直接対話するだけです。

B bb = PowerMockito.spy(new B(3));
// work with bb as normal
PowerMockito.doReturn(aa).when(bb).getA();
A mockedA = bb.getA(); // mockedA == aa
于 2012-11-10T01:13:46.397 に答える