我继承了庞大的代码库,需要添加一些单元测试,下面是测试场景的表示。
鉴于这两类:
package com.foo;
public class ExtendableClazz {
public String superClazzMethod(String str) {
return " A:" + str;
}
// ----------- THIS IS THE METHOD I WANT TO NOT CALL I.E REPLACE IN THE TEST -------------
public String methodWithSuper(String str) {
return " B:" + str;
}
}
和:
package com.foo;
public class ExampleClazz extends ExtendableClazz {
public String exampleClazzMethod(String str) {
return "C:" + str;
}
public String methodWithSuper(String str) {
String result = "";
result += exampleClazzMethod(str);
result += superClazzMethod(str);
result += super.methodWithSuper(str);
return result;
}
}
如何在第二类中存根 super.methodWithSuper(str) 。到目前为止我的 spock 测试(失败的是:
package com.foo
import spock.lang.Specification
class ExampleClazzTest extends Specification {
def "makeString #inputStr"() {
when:
ExampleClazz clazz = new ExampleClazz() {
// THIS DOES NOT WORK IT OVERRIDES THE METHOD IN THIS CLASS NOT ITS SUPER
@Override
String methodWithSuper(String str) {
return " STUB:" + str
}
}
then:
clazz.methodWithSuper(inputStr) == result
where:
inputStr || result
"foo" || "C:foo A:foo STUB:foo"
"bar" || "C:bar A:bar STUB:bar"
}
}
基本上我不想调用真正的“super.methodWithSuper”我想伪造它......
我尝试过搜索和模拟,我能得到的最接近的是上面的代码。
我认为如果不使用一些字节码操作库来更改超类的实际字节码,你就无法做到这一点,这将是一个非常高级的主题。
重构被测代码以使其更好地可测试而不需要类似的东西会更有意义。