如何在单元测试中使用spock存根/替换super方法

问题描述 投票:0回答:1

我继承了庞大的代码库,需要添加一些单元测试,下面是测试场景的表示。

鉴于这两类:

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”我想伪造它......

我尝试过搜索和模拟,我能得到的最接近的是上面的代码。

java unit-testing spock super
1个回答
0
投票

我认为如果不使用一些字节码操作库来更改超类的实际字节码,你就无法做到这一点,这将是一个非常高级的主题。

重构被测代码以使其更好地可测试而不需要类似的东西会更有意义。

© www.soinside.com 2019 - 2024. All rights reserved.