首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在私有字段上使用spock - test交互进行单元测试

在私有字段上使用spock - test交互进行单元测试
EN

Stack Overflow用户
提问于 2020-03-26 01:34:40
回答 1查看 41关注 0票数 0

我想使用Spock测试我的MCUModel类的addMCUremoveMCU方法。然而,我对如何处理这个问题感到有点困惑。

代码语言:javascript
复制
public class MCUModel {

    private static int counter = 1;

    private final ObjectProperty<MCU> selectedMCU;
    private final ObservableList<MCU> mcuList;

    public MCUModel() {
        selectedMCU = new SimpleObjectProperty<>(null);
        mcuList = FXCollections.observableArrayList();
    }

    public ObjectProperty<MCU> selectedMCUProperty() {
        return selectedMCU;
    }

    public void setSelectedMCU(MCU mcu) {
        selectedMCU.set(mcu);
    }

    public ObservableList<MCU> getMCUList() {
        return mcuList;
    }

    public void addMCU() {
        MCU mcu = new MCU();
        mcu.setName("MCU" + counter++);
        mcuList.add(mcu);
        selectedMCU.set(mcu);
    }

    public void removeMCU() {
        if (selectedMCU.get() == null) return;

        int index = mcuList.indexOf(selectedMCU.get());
        mcuList.remove(index);

        if (mcuList.size() == 0)
            selectedMCU.set(null);
        else if (mcuList.size() > index)
            selectedMCU.set(mcuList.get(index));
        else
            selectedMCU.set(mcuList.get(--index));
    }

}

在这里的其他示例中,建议按照以下方式更改构造器:

代码语言:javascript
复制
public MCUModel(ObjectProperty<MCU> selectedMCU, ObservableList<MCU> mcuList) {
        this.selectedMCU = selectedMCU;
        this.mcuList = mcuList;
    }

这将允许我模拟字段,以便测试是否调用了这些方法。然而,在这种情况下,我不确定这是不是正确的方法。

我猜想,对于addMCU方法,我想测试是否创建了一个新实例,并且mcuList.add(mcu)selectedMCU.set()都被调用并传递给这个实例。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-26 03:32:13

您的直觉是正确的,您不需要模拟MCUModel的字段来测试它。这样做会将您的测试耦合到类的私有数据的实现细节。测试根本不需要知道MCUModel有任何字段或依赖项;让测试忽略依赖项允许您在未来自由地更改它们(即重构),而不会破坏测试。

我会通过getter来测试setter。您可能会将其分解为两个以上的测试,或者可能使用循环;但其想法是使用模型在至少两种状态下测试每个方法:空和已填充。

代码语言:javascript
复制
def "AddMCU"() {
    given: "Empty model"
        MCUModel model = new MCUModel()
    when: "Add to empty model"
        model.addMCU()
    then: "Model is populated"
        model.getMCUList().size() == 1
        model.selectedMCUProperty() == model.getMCUList().first()
    when: "Add to populated model"
        model.addMCU()
    then: "Model size increments"
        model.getMCUList().size() == 2
        model.selectedMCUProperty() == model.getMCUList().last()
}

def "RemoveMCU"() {
    given: "Populated model"
        MCUModel model = new MCUModel()
        model.addMCU()
    when: "Remove from populated model"
        model.removeMCU()
    then: "Model is empty"
        model.getMCUList().isEmpty()
        model.selectedMCUProperty() == null
    when: "Remove from empty model"
        model.removeMCU()
    then: "Model remains empty"
        model.getMCUList().isEmpty()
        model.selectedMCUProperty() == null
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60854248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档