模拟受保护的构造函数

Mocking Protected Constructor

我想模拟 super() 调用 protected constructor

为此我使用 "PowerMockito.suppress" 但它不起作用(代码调用超级构造函数并抛出 runtimeException)。

如何模拟 super call(),使其什么都不做。

    public class FooClass {

        public void someMethod(){
            String arg1 = "arg1";
            Integer arg2 =  123;
            ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
        }
    }

    public class SuperClass {
         protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
    }

    public class ExtendedClass extends SuperClass{

        public ExtendedClass(String arg1, Integer arg2){
            super(arg1, arg2);
         }
    }

    @RunWith(PowerMockRunner.class)
    @PowerMockRunnerDelegate(MockitoJUnitRunner.class)
    @PowerMockIgnore({"javax.management.*", "org.apache.http.conn.ssl.*", "com.amazonaws.http.conn.ssl.*", "javax.net.ssl.*"})
    @PrepareForTest({SuperClass.class})
    public class TestClass extends TestCase{

        @InjectMocks
        FooClass fooClass = new FooClass();

        @Test
        public void test(){
            PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
            fooClass.someMethod();
        }
    }

您必须为测试准备 ExtendedClass 而不是 SuperClass。

改变

 @PrepareForTest({SuperClass.class})

 PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));

 @PrepareForTest({ExtendedClass.class})

 PowerMockito.suppress(PowerMockito.constructor(ExtendedClass.class, String.class, Integer.class));

您在我的机器上测试成功通过:

您使用哪个版本的 powermock 和 mockito?

这是我的:

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-all</artifactId>
    <version>1.10.19</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-module-junit4</artifactId>
    <version>1.7.3</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.powermock</groupId>
    <artifactId>powermock-api-mockito</artifactId>
    <version>1.7.3</version>
    <scope>test</scope>
</dependency>

你的问题的根本原因是@pvpkiran 已经写道你必须为测试准备 ExtendedClass 而不是 SuperClass

更新: 看看这个linkSuppress-Unwanted-Behavior#suppress-super-class-constructors

@RunWith(PowerMockRunner.class)
@PrepareForTest({TestParentConstructor.ExtendedClass.class})
public class TestParentConstructor {

    @Before
    public void init() {
        suppress(constructor(SuperClass.class));
    }

    @Test
    public void test(){
        FooClass fooClass = new FooClass();
        fooClass.someMethod();
    }

    public class FooClass {
        public void someMethod(){
            String arg1 = "arg1";
            Integer arg2 =  123;
            ExtendedClass extendedClass = new ExtendedClass(arg1, arg2);
        }
    }

    public class SuperClass {
        protected SuperClass(String arg1, Integer arg2) {throw new RuntimeException();}
    }

    public class ExtendedClass extends SuperClass{
        public ExtendedClass(String arg1, Integer arg2){
            super(arg1, arg2);
            System.out.println("Hello from Extended!");
        }
    }
}