Ich habe eine Klasse, die nur Aufgabe ist, eine List<Object>
nehmen und eine sortierte List<Object>
zurückgeben. Für ein Beispiel arbeitet die Sortiermethode in der Klasse mit einer Prozedur, die die Objekte zufällig in der Liste platziert.Komponententest für eine zufällige Liste <Object>
Der Versuch zu tun:, um den Test für diese Sortiermethode (oder Klasse) zu schreiben, die fehlschlagen muss, wenn die Sortierung tatsächlich nur zufällig ist. Das heißt, ich muss die List<Object>
Reihenfolge finden, um zu testen, nehme ich an.
Code
class RootLoggerFirstSorter {
List<LoggerConfig> sort(List<LoggerConfig> unSortedList) {
List<LoggerConfig> levelSortedList = new ArrayList<>(unSortedList);
Collections.sort(levelSortedList, new Comparator<LoggerConfig>() {
@Override
public int compare(LoggerConfig o1, LoggerConfig o2) {
if (o1.getLevel().intLevel() == o2.getLevel().intLevel()) {
return 0;
} else if (o1.getLevel().intLevel() < o2.getLevel().intLevel()) {
return 1;
} else {
return -1;
}
}}
);
LinkedList<LoggerConfig> sortedList = new LinkedList<LoggerConfig>();
for(Iterator<LoggerConfig> i = levelSortedList.iterator(); i.hasNext();) {
LoggerConfig cfg = i.next();
addNextLoggerConfig(cfg, sortedList);
}
return sortedList;
}
private void addNextLoggerConfig(LoggerConfig cfg, LinkedList<LoggerConfig> sortedList) {
if(cfg.getName() == null || cfg.getName().isEmpty()) {
sortedList.addFirst(cfg);
} else {
sortedList.addLast(cfg);
}
}
}
.....
expect(item1.getLevel()).andStubReturn(Level.DEBUG);
expect(item2.getLevel()).andStubReturn(Level.ERROR);
expect(item3.getLevel()).andStubReturn(Level.INFO);
.....
//Ignore the pre req for test setup
@Test
public void testSort() {
List<LoggerConfig> unsortedList = makeUnsortedList();
EasyMock.replay(item1,item2,item3);
List<LoggerConfig> sortedList = tested.sort(unsortedList);
assertThat("First item on the list is ERROR level: ", sortedList.get(0).getLevel(), is(Level.ERROR));
assertTrue(sortedList.get(1).getLevel().equals(Level.INFO) || sortedList.get(1).getLevel().equals(Level.INFO));
assertTrue(sortedList.get(2).getLevel().equals(Level.DEBUG) || sortedList.get(2).getLevel().equals(Level.DEBUG));
}
Aber dieser Test wird immer da nur, wenn schaute 1 am Index passieren Versuchte getestet werden und 2, Index 0 immer enthalten LoggerConfig mit einem leeren Namen [eingerichtet ist so gemacht]). Also dachte ich Sollte ich nur Unit-Test die Vergleichsmethode stattdessen? Wenn ja, wie?
Problem Das Problem ist, dass ich die Sortiermethode mit einer bestimmten Object-Eigenschaft, die die Ebene des LoggerConfig
Objekts ist, testen muss. Also muss der Test die List
Bestellung überprüfen.
Entweder Ihre Frage ist verwirrend oder es ist nur ich ... Was genau ist das Problem? Normalerweise würden Sie für jeden Testfall eine Testmethode schreiben, zum Beispiel "Liste in umgekehrter Reihenfolge sollte korrekt sortiert sein". In dieser Methode bereiten Sie die Liste vor, sortieren sie und überprüfen dann die Reihenfolge ... Ich verstehe nicht ganz, wo Sie Probleme haben ... –
@FlorianSchaetz Da ich die Integer-Werte der Log-Level nicht kenne, die in verwendet werden das Sortieren muss ich herausfinden, um erfolgreich zu testen. Allerdings sollte der Test natürlich noch prüfen, ob die Sortierung erfolgt ist. Daher sind zwei Tests erforderlich. So testet mein 'testSort()' nicht die beabsichtigte Funktionalität, die eine geordnete Liste und nicht zufällig zurückgeben muss. – shaz
Immer noch verwirrt. Wenn Sie die Protokollebenen kennen müssen, schauen Sie in den Code. Sollte dort angegeben werden. In Ihrem Test ist es völlig in Ordnung, sich darauf zu verlassen, dass der Loglevel beispielsweise 700 ... –