Search code examples
javajunit4powermockito

Mocking Protected Constructor


I want to mock super() call that has protected contructor.

For this purpose i use "PowerMockito.suppress" but it isn't work (the code call super constructor and it throw runtimeException).

How to mock super call(), so it doesn't do anything.

    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();
        }
    }

enter image description here


Solution

  • You have to Prepare ExtendedClass for Test and not SuperClass.

    change

     @PrepareForTest({SuperClass.class})
    
     PowerMockito.suppress(PowerMockito.constructor(SuperClass.class, String.class, Integer.class));
    

    to

     @PrepareForTest({ExtendedClass.class})
    
     PowerMockito.suppress(PowerMockito.constructor(ExtendedClass.class, String.class, Integer.class));