PowerMock ExpectNew将不会返回模拟实例

问题描述

我正在与PowerMock一起捕获要在我要测试的对象内部进行的构造函数调用。我在这里组装了一个示例,该示例基本上模仿了我在较大示例中想要做的事情。我在SO上也找到了类似问题的其他答案,我想我正在遵循答案中的建议,但似乎有些问题。这是我的示例:

import org.junit.jupiter.api.Test;
import org.junit.runner.RunWith;
import org.powermock.api.easymock.PowerMock;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.powermockrunner;

import static org.easymock.EasyMock.*;
import static org.junit.jupiter.api.Assertions.*;

class Inner {
    public Inner(String one,String two,Boolean three) {
        System.out.println("Calling inner constructor");
    }

    public String saySomething() {
        return "something";
    }
}

class Outer {
    private Inner inner;

    public Outer(String arg) {
        this.inner = new Inner(arg,"foo",Boolean.TRUE);
    }

    public String getInnerString() {
        return this.inner.saySomething();
    }
}

@RunWith(powermockrunner.class)
@PrepareForTest({Outer.class,Inner.class})
class PowerMockTest {

    @Test
    void testMockConstructor() throws Exception {
        Inner innerMock = mock(Inner.class);

        PowerMock.expectNew(Inner.class,anyObject(String.class),anyObject(Boolean.class)).andReturn(innerMock);
        expect(innerMock.saySomething()).andReturn("something else");

        PowerMock.replay(innerMock,Inner.class);

        Outer outer = new Outer("foo");
        String s = outer.getInnerString();

        PowerMock.verify(innerMock,Inner.class);

        assertEquals("something else",s);
    }

}

运行此测试时,我得到:

java.lang.AssertionError: 
  Expectation failure on verify:
    Inner.saySomething(): expected: 1,actual: 0

如果我将assert放在replay块中,则它不匹配,表示它期望something else但找到something

因此,基本上,它似乎捕获了构造函数调用,但它仍会调用实际的构造函数(我不希望这样做),并在实际实例上调用saySomething而不是模拟实例。

我想念什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)