gpt4 book ai didi

java - 使用 spock 进行单元测试 - 在私有(private)字段上测试交互

转载 作者:行者123 更新时间:2023-12-01 17:46:49 27 4
gpt4 key购买 nike

我想使用 Spock 测试我的 MCUModel 类的 addMCUremoveMCU 方法。但是,我对如何解决这个问题有点困惑。

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));
}

}

在此处的其他示例中,建议按照以下方式更改构造函数:

public MCUModel(ObjectProperty<MCU> selectedMCU, ObservableList<MCU> mcuList) {
this.selectedMCU = selectedMCU;
this.mcuList = mcuList;
}

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

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

最佳答案

您的直觉是正确的,您不需要模拟 MCUModel 的字段来测试它。这样做会将您的测试与类私有(private)数据的实现细节结合起来。测试根本不需要知道 MCUModel 有任何字段或依赖项;并使测试不了解依赖关系使您可以在将来自由地更改它们(即重构)而不会破坏测试。

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

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
}

关于java - 使用 spock 进行单元测试 - 在私有(private)字段上测试交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60854248/

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