gpt4 book ai didi

java - 验证是否调用了 protected super 方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:23:18 25 4
gpt4 key购买 nike

我有以下结构:

class Bar{
....
protected void restore(){
....
}

....
}

这个类由 Foo 扩展如下:

class Foo extends Bar{
....

@Override
public void restore(){ //valid override
super.restore();

....
}
}

在我的 jUnit 测试中,我想测试当调用 foo.restore() 时,随后调用 super.restore()。因此,下面是我的 jUnit 测试方法:

class FooTest{
@Tested
Foo _foo;

@Test
void testRestore(final Bar bar){

new Expectations(){{
bar.restore(); times = 1; // Error! bar.restore() not visible
}};

Deencapsulation.invoke(_foo,"restore");
}
}

不幸的是,我的测试无法编译。原因是 1) 父级的 restore()protected 和 2) FooTestFoo 存在与 Bar 一起在一个单独的项目(因此也是文件夹)中。

有没有办法达到想要的测试?我检查了 jMockit tutorials (在过去的几个月里多次)并且没有看到类似的测试(在谷歌上搜索也是如此)。


更新

在回复的帮助下,我明白强制子类调用 super 不是最佳实践,但这不是我的实现,我仍然必须测试它。我仍在寻找一种方法来执行我的 jUnit 测试,以检查是否正在调用父级。

最佳答案

所以基本上您是在尝试执行调用 super 并尝试允许子类化的契约(Contract)?我认为这不容易完成,因为动态调度会隐藏 Java 中的行为。我认为 Mocking 不会捕捉到这一点。

确保调用 super 的一种方法是将 super 和扩展分解为 2 个方法,例如

class Foo {
public final void restore() {
//parent code...
doRestore();
}

protected void doRestore() {
//empty base implementation
}
}

class Bar extends Foo {
protected void doRestore() {
//do my subclass specific restore stuff here
}
}

关于java - 验证是否调用了 protected super 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14286216/

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