Unittest using spock - тестирование взаимодействия на приватных полях - PullRequest
0 голосов
/ 25 марта 2020

Я хочу проверить методы addMCU и removeMCU моего класса MCUModel, используя Спока. Тем не менее, я немного озадачен тем, как подойти к этому.

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() вызываются и передаются этому экземпляру.

1 Ответ

0 голосов
/ 25 марта 2020

Ваши инстинкты верны, и вам не нужно высмеивать поля MCUModel, чтобы проверить это. Это позволит связать ваши тесты с деталями реализации личных данных класса. Тесты не должны знать, что MCUModel вообще имеет какие-либо поля или зависимости; а сохранение тестов в неведении о зависимостях дает вам свободу изменять их в будущем (т.е. рефакторинг), не прерывая тесты.

Я бы тестировал установщики через геттеры. Вы можете разбить это на более чем два теста или, возможно, использовать цикл; но идея состоит в том, чтобы проверить каждый метод с моделью, по крайней мере, в двух состояниях: пустой и заполненный.

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
}
...