Я пытаюсь написать единичный тест для действия «сохранить как» с помощью mockito. Часть этого действия создает и показывает FileDialog, где пользователь может ввести файл для сохранения. Выбор файла - это не то, что я могу автоматизировать, поэтому хочу высмеять FileDialog и высмеять mockedFileDialog.getFiles()
, чтобы вернуть файл, который я хочу «сохранить».Mocking защищенный метод родительского класса дает ошибку «имеет защищенный доступ»
Проблема в том, что диалог файла создается в родительском классе моего действия «сохранить как». when(..)
, похоже, работает только на насмешки, но насмехается над классом, который я хочу проверить, поражает точку упражнения. Затем я тестирую только методы, которые не очень полезны. Я мог бы просто запустить AbstractSaveAction.saveNet(..)
в тесте, но таким образом я не могу быть уверенным, что действие сохранения действительно работает - я бы просто тестировал, если есть метод, который что-то спасет, но я не могу проверить, есть ли цепочку событий, которая вызывает эту функцию.
Испытание ниже даст:
SaveActionTest.java:[60,24] getFileDialog(java.lang.String,java.lang.String) has protected access in application.AbstractSaveAction
Что такое правильный способ проверить это действие?
Код для тестирования
public class SaveAsAction extends AbstractSaveAction {
public SaveAsAction(Controller controller, View view) {
super("", "", controller, view);
}
@Override
public void actionPerformed(ActionEvent e) {
saveAsNet();
}
}
public abstract class AbstractSaveAction extends GuiAction {
public AbstractSaveAction(..) {
//...
}
protected final File saveAsFile(FileDialog fileDialog, String extension) {
//...
}
protected final void saveAsNet() {
FileDialog fileDialog = getFileDialog("Save the world", "xml");
File file = saveAsFile(fileDialog, "xml");
saveNet(file);
}
protected final void saveNet(File file) {
try {
controller.saveAsFile(file);
} catch (TicklishPolarBearException e) {
//Panic
}
}
protected final FileDialog getFileDialog(String title, final String extension) {
FileDialog fileDialog = new FileDialog(view, title, FileDialog.SAVE);
fileDialog.setFile("*." + extension);
fileDialog.setFilenameFilter(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith("." + extension);
}
});
return fileDialog;
}
}
Тест
@Test
public void performsSaveAsWhenNetHasNoFile()
throws AllKindsOfExceptions {
NetName normalName = new NormalNetName("");
when(mockNet.getName()).thenReturn(normalName);
File file = new File("test.xml");
//This will error out
when(saveAction.getFileDialog("Save the world", "xml")).thenReturn(mockFileDialog);
when(mockFileDialog.getFiles()).thenReturn(new File[]{file});
saveAsAction.actionPerformed(null);
verify(mockController).saveAsFile(file);
}
Mockito не может издеваться окончательные методы. Чтобы иметь доступ к защищенному методу, тестовый класс должен быть в том же пакете, что и AbstractSaveAction. –
Если бы я сделал метод getFileDialog не окончательным, мог бы быть способ его издеваться? – Sumurai8