[英]Unittest using spock - test interaction on private fields
我想使用 Spock 测试我的MCUModel
类的addMCU
和removeMCU
方法。 但是,我对如何解决这个问题感到有些困惑。
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
的字段来测试它。 这样做会将您的测试与类私有数据的实现细节结合起来。 测试根本不需要知道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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.