PowerMock + EasyMock:没有invokation的私有void方法

时间:2013-06-10 15:34:53

标签: java junit4 easymock powermock

美好时光!

我需要使用模拟实现替换类的private 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”方法,这对我的任务来说是错误的。请有人建议,如何避免方法调用,并可能用自定义方法替换方法体?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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!");
        }
    }
}