当父项位于不同的包中且子类是抽象时,模拟受保护的父方法

时间:2016-07-26 17:49:49

标签: java unit-testing mockito powermock powermockito

我需要在我测试的类的父类中模拟受保护的方法,但父类在不同的包中。我认为解决方案是使用PowerMockito.spy()但我无法实例化Child类型,因为它是抽象的。在没有重构的情况下,必须有解决这个问题的方法。

这是依赖关系。

        <dependency org="org.powermock" name="powermock-core" rev="1.6.4"/>
        <dependency org="org.powermock" name="powermock-module-junit4" rev="1.6.4"/>
        <dependency org="org.powermock" name="powermock-api-mockito" rev="1.6.4"/> 

这是遗留代码,所以我无法重构,但这里是简化代码。

Parent.java

package parent;

public class Parent {

    // Want to mock this protected parent method from different package
    protected String foo() {

        String someValue = null;

        // Logic setting someValue

        return someValue;
    }
}

Child.java

package child;

import parent.Parent;

public abstract class Child extends Parent {

    String fooString = null;

    public String boo() {

        this.fooString = this.foo();

        String booString = null;

        // Logic setting booString

        return booString;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以使用PowerMock来模拟非公开的方法

@RunWith(PowerMockRunner.class)
public class ChildTest {

   @Test
   public void testBoo() throws Exception {
      Child child = PowerMockito.mock(Child.class);
      PowerMockito.when(child, "foo").thenReturn("someValue");
      PowerMockito.doCallRealMethod().when(child).boo()
      String boo = child.boo();

      //assert here whatever you want to assert
   }
}