簡體   English   中英

PowerMock + EasyMock:無需調用的私有無效方法

[英]PowerMock + EasyMock: private void method without invokation

美好時光!

我需要用模擬實現替換類的私有void方法,並且無法弄清楚如何做到這一點。 我試圖使用這樣的構造:

Test test = PowerMock.createPartialMock(Test.class, "setId");
PowerMock.expectPrivate(test , "setId", EasyMock.anyLong()).andAnswer(
    new IAnswer<Void>() {
        @Override
        public Void answer() throws Throwable {
            return null;
        }
    });
PowerMock.replay(test);

但是內部PowerMock的類WhiteBox調用了我的“ setId”方法,這對我的任務是錯誤的。 有人可以建議如何避免方法調用,並可能用自定義方法替換方法主體嗎?

最后。 我有解決方案。 問題是我錯過了以下注釋:

@RunWith(PowerMockRunner.class)
@PrepareForTest(Test.class)

無論如何,要使PowerMock正常工作,我需要添加一些注釋似乎很令人困惑。 如果那不是遺留代碼,我會更喜歡Mockito。

不太確定我是否知道這個問題。 但是對我來說,下面的代碼可以完美工作,只是字符串"Invoked!" 正在打印,如果我刪除了test.setS(33L); 測試將失敗,並帶有以下異常:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MainTest.Test2.class)
public class MainTest {

    @Test
    public void testName() throws Exception {
        Test2 test = PowerMock.createPartialMock(Test2.class, "setS");
        PowerMock.expectPrivate(test , "setS", EasyMock.anyLong()).andAnswer(
                new IAnswer<Void>() {
                    @Override
                    public Void answer() throws Throwable {
                        System.out.println("Invoked!");
                        return null;
                    }
                }).atLeastOnce();
        PowerMock.replay(test);
        test.setS(33L);
        PowerMock.verify(test);

    }


    class Test2 {
        long s;

        private long getS() {
            return s;
        }

        private void setS(long s) {
            this.s = s;
            System.out.println("Not this!");
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM