gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:51:16 25 4
gpt4 key购买 nike

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

问题是在模拟公共(public)类上 stub 接口(interface)方法时,该公共(public)类扩展了具有接口(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 来解决这个问题,但这不是很好。有什么方法可以 stub 在 PackagePrivate 类上实现的方法吗?

最佳答案

您可以模拟接口(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com