java - Mockito 在尝试对包私有(private)父类(super class)上实现的 stub 方法调用实际方法

标签 java mockito

这可能与 this question 具有相同的根本问题,但更容易重现。

问题是在模拟的公共(public)类上 stub 接口(interface)方法时,该类扩展了具有接口(interface)方法实现的包私有(private)类。 Mockito 会调用包私有(private)类中真正的接口(interface)方法实现。请参阅以下示例。

界面

public interface DontCallMe {
    int dontCallMeSuper();
    int dontCallMe();
}

封装默认类,实现接口(interface)方法之一。

abstract class PackagePrivate
        implements DontCallMe {

    @Override
    public int dontCallMeSuper() {
        throw new IllegalArgumentException("don't call me super");
    }
}

实现另一个的包私有(private)类的公共(public)子类。

public class Public
    extends PackagePrivate {

    public Public() {
        super();
    }

    @Override
    public int dontCallMe() {
        throw new IllegalArgumentException("don't call me");
    }
}

测试类

import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import org.junit.Test;

public class ExampleJunit {

    @Test
    public void testStaticConstructorInnerClass() {
        final Public comparable = mock(Public.class);
        when(comparable.dontCallMe()).thenReturn(1);
        when(comparable.dontCallMeSuper()).thenReturn(1);
    }
}

运行测试的结果

java.lang.IllegalArgumentException: don't call me super
at PackagePrivate.dontCallMeSuper(PackagePrivate.java:6)
at Public.dontCallMeSuper(Public.java:1)
at ExampleJunit.testStaticConstructorInnerClass(ExampleJunit.java:19)

我可以通过公开 PackagePrivate 来解决这个问题,但这并不是很好。有什么方法可以让我在 PackagePrivate 类上实现 stub 方法吗?

最佳答案

您可以模拟接口(interface) (DontCallMe) 而不是类 (Public):

    final DontCallMe comparable = mock(DontCallMe.class);

或者,如果您需要模拟 Public 中但不在 DontCallMe 中的方法,您可以创建一个新接口(interface)并模拟它。

例如,使用原始的 DontCallMe 定义,您可以执行以下操作:

public interface IPackagePrivate extends DontCallMe {
    int extraMethod();
}

------

abstract class PackagePrivate implements IPackagePrivate { 
    public int dontCallMeSuper() { 
        throw new IllegalArgumentException("don't call me super");
    } 
}

------

public class Public extends PackagePrivate { 

    public Public() { 
        super(); 
    } 

    public int dontCallMe() { 
        throw new IllegalArgumentException("don't call me");
    }

    public int extraMethod() { 
        throw new IllegalArgumentException("extra method");
    } 
} 

------

import static org.mockito.Mockito.mock; 
import static org.mockito.Mockito.when; 
import org.junit.Test; 

public class ExampleJunit { 

    @Test
    public void testStaticConstructorInnerClass() { 
        final IPackagePrivate comparable = mock(IPackagePrivate.class);
        when(comparable.dontCallMe()).thenReturn(1);
        when(comparable.dontCallMeSuper()).thenReturn(1);
        when(comparable.extraMethod()).thenReturn(1);
    } 
} 

关于java - Mockito 在尝试对包私有(private)父类(super class)上实现的 stub 方法调用实际方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30631816/

相关文章:

java - 谷歌分析的 setCredentialStore 方法的替代方法

java - 如何将每个人的结果保存在文本文件中?

java - 我将如何创建一个旋转矩阵,将 X 旋转 a,Y 旋转 b,Z 旋转 c?

android - 如何将库添加到 testImplementation 和 androidTestImplementation

java - Mockito:尚未定义但知道返回类型的模拟方法

java - 在Windows上将mongoDB安装为docker镜像

java - JTable 将值传递到 excel(文本格式)

java - 如何防止 Mockito 动态地 mock ......?

java - Mockito/GWT : mocked view's widgets are null

java - ResourceAccessException 内 SocketTimeout 异常的 Junit 代码覆盖率