java - 当父级在不同的包中时模拟 protected 父级方法

标签 java unit-testing mockito powermock powermockito

我需要在被测类的父类中模拟 protected 方法,但父类位于不同的包中,因此我的测试类无法访问该方法,因此我无法模拟它。必须有一个无需重构的解决方案

我需要使用 Powermock 和 Mockito。这是 JAR

  • mockito-all 1.10.8
  • powermock-core 1.6.1
  • powermock-module-junit4 1.6.1
  • powermock-api-mockito 1.6.1
  • 6 月 4.12

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

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 class Child extends Parent {

    String fooString = null;

    public String boo() {

        this.fooString = this.foo();

        String booString = null;

        // Logic setting booString

        return booString;
    }
}

ChildTest.java

package child;

import static org.mockito.Mockito.spy;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;

import parent.Parent;

@RunWith(PowerMockRunner.class)
@PrepareForTest({ Parent.class, Child.class })
public class ChildTest {

    // Class Under Test
    Child cut;

    @Before
    public void setUp() throws Exception {

        // Partial mock to mock methods in parent class
        cut = spy(new Child());

    }

    @Test
    public void testBoo() {

        // TODO: Need to mock cut.foo() but can't figure out how.

        // Following gives me this error: The method foo() from the type Parent is not visible
       Mockito.when(((Parent)cut).foo()).thenReturn("mockValue");

        // Test
        cut.boo();

        // Validations
        Assert.assertEquals(cut.fooString, "mockValue");

    }
}

最佳答案

只需创建一个新类来测试扩展您要测试的类,并在那里覆盖您的方法。

那看起来像这样:

public class ChildForTest extends Child{
     @Override
     protected String foo() {
         //mock logic here
    }
}

编辑: 如果你想避免新的类定义,你可以使用匿名类

@Before
public void setUp() throws Exception {

    // Partial mock to mock methods in parent class
    cut = new Child(){
        @Override
        protected String foo(){
            //mock logic here
            return "";
        }
    };
}

关于java - 当父级在不同的包中时模拟 protected 父级方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684328/

相关文章:

java - 什么是NullPointerException,我该如何解决?

java - 如何验证没有调用模拟对象的方法?莫基托

java - 使用 When to stub 返回值的 Mockito 语法 Java Junit

java - 单元 : How to write test case using jUnit and Mockito

java - 每线程单例模式

在 Jenkins 上解析 Groovy 脚本时出现 java.lang.StackOverflowError

java - JSF 针对两个必填输入字段发出一条错误消息

java - FEST:如何正确使用NoExitSecurityManager?

c# - NUnit 理论有一个异常(exception)

Java JUnit - 是否可以确定是否抛出异常以及抛出哪个异常?