【发布时间】:2015-08-18 08:31:09
【问题描述】:
这可能是与this question 相同的根本问题,但更容易重现。
问题是在模拟的公共类上存根接口方法时,该类扩展了具有接口方法实现的包私有类。 Mockito 会在包私有类中调用真正的接口方法实现。请参阅以下示例。
界面
public interface DontCallMe {
int dontCallMeSuper();
int dontCallMe();
}
实现接口方法之一的包默认类。
abstract class PackagePrivate
implements DontCallMe {
@Override
public int dontCallMeSuper() {
throw new IllegalArgumentException("don't call me super");
}
}
实现另一个的包私有类的公共子类。
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 类上实现的方法?
【问题讨论】: