1

美好时光!

我需要用模拟实现替换类的私有 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);

但是名为 WhiteBox 的内部 PowerMock 类调用了我的“setId”方法,这对我的任务来说是错误的。有人可以建议如何避免方法调用并可能用自定义方法替换方法体吗?

4

2 回答 2

2

最后。我有解决办法。问题是我错过了以下注释:

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

无论如何,要使 PowerMock 正常工作,我需要添加一些注释,这似乎相当令人困惑。如果那不是遗留代码,我更喜欢 Mockito。

于 2013-06-11T05:48:12.493 回答
0

不太确定我是否得到了这个问题。但对我来说,下面的代码完美无缺,只"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!");
        }
    }
}
于 2013-06-10T18:36:40.950 回答