Ho questo codice in un controller di un'implementazione MVC:
public void execute() {
try {
String path = userSelectsFile();
if ( path == null ) return; //Just returns if the user press "Cancel"
//Load the data
Collection<Info> infos = Infos.fromJSON(getInputReader(path));
//Show the data in the interface
new ShowTransformationsInTree(win(), infos, win().getTree()).execute();
} catch (Exception e) {
new ComplainAction(win(), "Unable to...blah, blah", e).execute();
}
}
Per verificare ciò, devo simulare l'interfaccia utente per mostrare la finestra di dialogo dei file e rendere getInputReader
metodo un metodo factory astratto.
Codice test:
/**
* Mocks the LoadTransformationsAction so the factory method getReader returns a ByteInputStream
*/
public class MockLoadTransformationsAction extends LoadTransformationsAction {
//CONSTRUCTOR REMOVED FOR CLARITY.....
@Override
protected InputStreamReader getInputReader(String path) {
assertEquals(FAKE_ABSOLUTE_PATH, path);
return new InputStreamReader(
new ByteArrayInputStream(TestHelpers.createDataBytes());
}
}
/**
* Test the proper loading of the data.
*/
@Test
public void testLoadData(@Mocked final FileChooser anyChooser) {
new Expectations() {{
//Mocks the IntelliJ idea API
FileChooser.chooseFile(null, null, null); result = new MyFakeVirtualFile(); //Returns a fixed path
}};
//Loads the data from the JSON file
MainToolWin m = new FakeMainToolWin();
LoadTransformationsAction action = new MockLoadTransformationsAction(
m, new FakeProject(), new MockInputProgram());
action.execute();
//Test that the transformations are in the UI Tree
DefaultTreeModel model = (DefaultTreeModel)m.getTree().getModel();
assertEquals(2, model.getChildCount(model.getRoot()));
assertEquals(3, model.getChildCount(model.getChild(model.getRoot(), 0)));
}
Domande:
Sto facendo troppo per testare troppo poco?
Come puoi vedere ci sono oggetti finti e finti fino in fondo. Può fare così tanta derisione che il mio test non è affidabile?
C'è un design migliore?