ich habe vom Prof 19 Java Dateien bekommen, in denen alle das selbe machen(Liste mit maximal einer Zahl in der Liste). Diese Dateien heißen alle exakt gleich "SoloList" und sind in verschiedenen Package "SoloList.p01" bis "SoloList.p19".
Jede SoloList ist anders implementiert, manche haben Fehler und manche nicht.
Mein Problem:
Wenn ich eine JUnit Test schreibe, kommt der Punkt, wo der Compiler von mir fordert aus welchen Package ich diese Klasse SoloList instanzieren soll.
Es soll halt irgendwie von allen 19 Dateien dies nutzen.
Denn meine klare Aufgabe lautet:
"Ihre Aufgabe ist es, eine JUnit Testklasse zu entwickeln, die die fehlerhaften Implementierungen erkennt und die Fehler ausweist."
Muss ich nun 19 Test schreiben oder geht das eleganter?
YourListgetYourListImplInstance(String name)throwsInstantiationException,IllegalAccessException,ClassNotFoundException{Class<?> result =null;finalString listImplClassName ="package.your.lists."+ name+"Postfix";
LOG.debug("load List: "+ listImplClassName);
result =Class.forName(listImplClassName);return(YourList) result.newInstance();}
Da nicht wirklich klar ist wie ähnlich sich die Klassen im Namen sind und wie die Package-Struktur ist kann man jetzt nicht mehr dazu sagen. Vielleicht ist die Initialisierung auch bei jeder Liste anders, dann macht dieser Ansatz auch schon wieder keinen Sinn.
Nach erneutem aufmerksamen Lesen der Frage lässt es sich doch konkretisieren:
Java:
//pseudocode. Sinn sollte klar werden
fori 0...9YourList list =getYourListImplInstance("p0"+ i);// testsYourListgetYourListImplInstance(String subpackage)throwsInstantiationException,IllegalAccessException,ClassNotFoundException{Class<?> result =null;finalString listImplClassName ="package.your.lists."+ subpackage +".SoloList";
LOG.debug("load List: "+ listImplClassName);
result =Class.forName(listImplClassName);return(YourList) result.newInstance();}
So klar ist die Aufgabe nicht. Sollen alle Klassen mit einem JUnit-Test automatisch getestet werden oder darfst Du die Klassen einfach austauschen und neu übersetzen?
Stellt euch vor es wird eine Aufgabe gestellt und 19 verschiedene Studenten lösen sie.
Alle lösen die Aufgabe richtig. Jedoch jeder anders. (Bei mir gibt es eben Fälle, wo es eben Fehler gibt.)
So klar ist die Aufgabe nicht. Sollen alle Klassen mit einem JUnit-Test automatisch getestet werden oder darfst Du die Klassen einfach austauschen und neu übersetzen?
Es wird nichts erwähnt.
In der Aufgabe steht nur das die die Dateien alle vom Sinn her das selbe machen, nur anders implementiert sind bzw. paar fehlerhaft sind.
Und als Schlusssatz:
"Ihre Aufgabe ist es, eine JUnit Testklasse zu entwickeln, die die fehlerhaften Implementierungen erkennt und die Fehler ausweist."
Also das ist nicht definiert.
Natürlich wäre es angenehmer, wenn alle Klassen automatisch übersetzt werden.
Wenn du mit Header meinst, ob und was in den einzelnen Klassen bei package steht. Sie haben und da muss ich mich zu vorhin korrigieren nicht SoloList.p01 bis SoloList.p19 stehen, sondern nur p01 bis p19.
Also ganz oben von der Klasse steht:
Code:
package p01;
import ...
public class SoloList extends AbstractList<Integer>{
@looparda dürfte gemeint haben, ob die Klassen alle die gleiche Basisklasse erweitern oder das gleiche Interface implementieren.
Das ist das eleganteste, das mir dazu einfällt. Da es einen Basistypen gibt wird es sehr einfach:
Java:
importorg.junit.Assert;importorg.junit.Test;importstaticorg.hamcrest.CoreMatchers.equalTo;publicclassTestLoading{@TestpublicvoidtestExecution()throwsIllegalAccessException,ClassNotFoundException,InstantiationException{for(int i =1; i <=2; i++){finalString subpackage =getSubpackage(i);finalAbstractList<Integer> yourList =getListInstance(subpackage);finalInteger result = yourList.get(0);// Replace with actual list implementation testsAssert.assertThat(result,equalTo(i));System.out.println(result);}}privateStringgetSubpackage(int i){returnString.format("p%02d", i);}privateAbstractList<Integer>getListInstance(String subpackage)throwsInstantiationException,IllegalAccessException,ClassNotFoundException{Class<?> result;finalString listImplClassName =getClass().getPackage().getName()+"."+ subpackage +".SoloList";System.out.println("loading List: "+ listImplClassName);
result =Class.forName(listImplClassName);return(AbstractList<Integer>) result.newInstance();}}publicclassSoloListextendsAbstractList<Integer>{@OverridepublicIntegerget(int index){return1;//TODO}}publicclassSoloListextendsAbstractList<Integer>{@OverridepublicIntegerget(int index){return2;//TODO}}...
Das ist das eleganteste, das mir dazu einfällt. Da es einen Basistypen gibt wird es sehr einfach:
Java:
importorg.junit.Assert;importorg.junit.Test;importstaticorg.hamcrest.CoreMatchers.equalTo;publicclassTestLoading{@TestpublicvoidtestExecution()throwsIllegalAccessException,ClassNotFoundException,InstantiationException{for(int i =1; i <=2; i++){finalString subpackage =getSubpackage(i);finalAbstractList<Integer> yourList =getListInstance(subpackage);finalInteger result = yourList.get(0);// Replace with actual list implementation testsAssert.assertThat(result,equalTo(i));System.out.println(result);}}privateStringgetSubpackage(int i){returnString.format("p%02d", i);}privateAbstractList<Integer>getListInstance(String subpackage)throwsInstantiationException,IllegalAccessException,ClassNotFoundException{Class<?> result;finalString listImplClassName =getClass().getPackage().getName()+"."+ subpackage +".SoloList";System.out.println("loading List: "+ listImplClassName);
result =Class.forName(listImplClassName);return(AbstractList<Integer>) result.newInstance();}}publicclassSoloListextendsAbstractList<Integer>{@OverridepublicIntegerget(int index){return1;//TODO}}publicclassSoloListextendsAbstractList<Integer>{@OverridepublicIntegerget(int index){return2;//TODO}}...
Die Idee gefällt mir besonders gut.
Was ich mich nur frage.
Es wird ein Test durchgeführt auf p01. Dann geht die Liste weiter auf p02. Nur wie starte ich dann den Test erneut?