JUnit - was mocken, was nicht?

Status
Nicht offen für weitere Antworten.

skittish

Mitglied
Hallo,

stehe gerade vor der stilistischen Frage wie weit ich mit meinen Unit Tests gehen soll. Bisher habe ich den grundsatz der Unabhängigkeit von anderen Objekten mehr oder minder vernachlässigt. Aber manchmal kommt auch folgendes bei rum:

Java:
@Test
@SuppressWarnings("unchecked")
public void getChildren() {
	// Mocks
	MyField mock = createMock(MyField.class);
	MyField mock_a = createMock(MyField.class);
	MyField mock_b = createMock(MyField.class);
	
	// mock_a & mock_b sind leafs (wird durch isSet() bestimmt)
	expect(mock_a.isSet()).andReturn(false);
	expect(mock_b.isSet()).andReturn(false);
	replay(mock_a);
	replay(mock_b);
	
	// mock soll hingegen kein leaf sein, also sollte dieses MyField einen Iterator liefern
	Iterator<MyField> it = createMock(Iterator.class);
	expect(it.hasNext()).andReturn(true);
	expect(it.next()).andReturn(mock_a);
	expect(it.hasNext()).andReturn(true);
	expect(it.next()).andReturn(mock_b);
	expect(it.hasNext()).andReturn(false);
	replay(it);
	
	expect(mock.isSet()).andReturn(true);
	expect(mock.iterator()).andReturn(it);
	replay(mock);
	
	// noch ein treeNode entstehen lassen
	MyTreeNode node = new MyTreeNode(mock);
	
	// Und testen ob das TreeNode.children funktioniert ...
	Enumeration<MyField> e = node.children();
	assertThat(e, notNullValue());
	assertThat(e.hasMoreElements(), is(true));
	assertThat(e.nextElement(), is(mock_a));
	assertThat(e.hasMoreElements(), is(true));
	assertThat(e.nextElement(), is(mock_b));
}

Hier hätte ich einen Unit Test, welcher genau bestimmen kann ob MyTreeNode.children() funktioniert. Und dies unabhängig von der Klasse MyField, welche nichtmals implementiert sein müsste. (Ganz im Sinne des TDD) Es wäre hier weitaus einfacher gewesen die Abhängigkeit von MyField hinzunehmen und auf das Mocken zu verzichten. Mittlerweile halte ich dies für recht zeitaufwändig, zumal man separat nochmal einen Funktionstest durchführen müsste, um Auswirkungen von Änderungen an MyField.isSet() testen zu können.

Kommen wir also zu der entscheidenden Frage: "Wie weit geht Ihr bezüglich Abhängigkeiten in Unit Tests?" Mich interessiert einfach das Vorgehen von anderen, sehe im Bereich Unit Tests sehr wenig fremden Code :/
 
Zuletzt bearbeitet:
M

maki

Gast
Tests mit Mock Objekten = white box tests = fragile tests
Je mehr die Mocks "wissen", umso fragiler die Tests.

IMHO sieht dein (Test)Code nicht aus als ob er durch TDD erzeugt wurde ;)

Ansonsten wäre es von Vorteil deine Tests besser zu strukturieren, man erkennt nämlcih nicht auf den ersten Blick worum es geht, dafür aber gibt es Redundanzen(Factory Methoden mit aussagefähigen Namen, eigene Asserts etc. können helfen), die Benamung ist schrecklich(mock_a???), man vergebe mir meine deutlichen Worte :)

Ein Buch das ich dir empfehlen kann ist XUnit, hier ein Video zur Einstimmung: YouTube - Automated Testing Patterns and Smells
 

skittish

Mitglied
Vorweg erstmal wie ich es ohne Mocks testen müsste, kurz schluderig konstruiert.
Java:
@Test
public void getChildren() {
	// Datenstruktur instanzieren
	MyField root = MyFieldFactory.createMyField();
	root.setIdent(6548);
	root.setType(Type.COUNT);
	MyField child1 = MyFieldFactory.createMyField();
	child1.setIdent(4354);
	child1.setType(Type.REAL);
	MyField child2 = MyFieldFactory.createMyField();
	child2.setIdent(435423);
	child2.setType(Type.REAL);
	
	root.addMyField(child1);
	root.addMyField(child2);
		
	// noch ein treeNode entstehen lassen
	MyTreeNode node = new MyTreeNode(root);
	
	// Und testen ob das TreeNode.children funktioniert ...
	Enumeration<MyField> e = node.children();
	assertThat(e, notNullValue());
	assertThat(e.hasMoreElements(), is(true));
	assertThat(e.nextElement(), is(child1));
	assertThat(e.hasMoreElements(), is(true));
	assertThat(e.nextElement(), is(child2));
}

Nun habe ich das Problem, dass dieser Test komplett von MyField abhängig ist.
Fehler in MyField führen dazu, dass ein Test, welcher für eine ganz andere Methode geschrieben wurde fehlschlägt. Hätte somit eigentlich schon garkeinen Unit test mehr, sondern eher einen Funktionstest. Oder sind die Begrifflichkeiten nicht so strikt definiert? Bisher ging ich von Unit Tests als testen einer Unit aus und nicht des ganzen Konstrukts.

Zum TDD, verstehe ich hier was falsch, wenn ich frage "Wie könnte ich ohne MyField überhaupt testgetrieben entwickeln, wenn nicht mit Hilfe des Mock Objekts?"



Mir ist bewusst, dass der Test nicht schick aussieht, bzw. überhaupt nicht strukturiert ist. Aber es war die einfachste Möglichkeit dies hier in einer Methode zu demonstrieren.
Mock Objekte auslagern würde ich dennoch nur sehr selten, einen Stub schon, aber ein Mock, was einen ganz spezifischen Zweck erfüllt ist zu oft sinnlos. Dies brauche ich in der Form auch nur einmal.
 
M

maki

Gast
Methoden aufzubrechen & Teile auszulagern hat nciht wirklich etwas mit wiederverwendbarkeit zu tun, sondern mit ausdrucksstarkem Code. Allerdings sehe ich Redundanzen in deinem Code, die würden weniger werden.
Jedenfalls ist es nicht unüblich die Erzeugung von Obejkten (auch von Mocks) auszulagern.

Anstatt Mocks gibt es noch Stubs & Fakes. Ob die besser sind kommt ganz darauf an.

Was genau willst du denn testen?
Die getChildren Methode?
Oder das setzen der Leaf Eigenschaft?
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Zrebna Wieso sind eigentlich JUnit-Tests in src/test/java platziert - nur Konvention? Allgemeine Java-Themen 7
harrytut Java Input/Output Tests Junit Allgemeine Java-Themen 3
B Junit Test Allgemeine Java-Themen 8
J Junit surefire: enrich test information Allgemeine Java-Themen 0
J Junit start surefire for manual testing Allgemeine Java-Themen 1
P No JUnit tests found Allgemeine Java-Themen 5
F Junit Test + Cucumber - JSON auslesen und in einem weiteren Schritt nutzen Allgemeine Java-Themen 0
J JUnit - Auslassen von Code Allgemeine Java-Themen 25
S Zugriff auf jUnit Test Suite Runner-Instanzen innerhalb von Test Classes Allgemeine Java-Themen 7
S Eclipse Probleme beim Implementieren / Ausführen von jUnit 5-Test Suites Allgemeine Java-Themen 14
S Parametrisierte jUnit 5-Tests mit eigenen Datentypen/Klassen-Objekten als Test-Parameter Allgemeine Java-Themen 0
K Input/Output JUnit: Log Inhalte, falsche Assertion Allgemeine Java-Themen 2
H OOP Testen einer Exception mit JUnit Allgemeine Java-Themen 8
AssELAss Junit-Tests für SQL-Veribindung sowie SQL-Queries? Allgemeine Java-Themen 3
O Maven - JUnit - H2 Allgemeine Java-Themen 1
M Selenium JUnit Tests (Auswahl von Testmethoden auswerten) Allgemeine Java-Themen 5
C JUNIT - ANT - build.xml Allgemeine Java-Themen 0
Airwolf89 JUnit: Vorschläge/ Best Practice Allgemeine Java-Themen 7
M JUnit Serverseitig? Wie geht sowas? Allgemeine Java-Themen 2
E JUnit wie Testergebnisse pro Test ("Test Report") erhalten? Allgemeine Java-Themen 1
B JUnit Zufalls Operation testen Allgemeine Java-Themen 1
P JUnit Allgemeine Java-Themen 2
B jUnit 4: Wie protokolliert man Testergebnisse? Allgemeine Java-Themen 1
H JUnit Fehler beim Compilieren - erledigt Allgemeine Java-Themen 0
M JUnit Test Suites Allgemeine Java-Themen 2
L JUnit - automatisiertes vs. manuelles Testen? Allgemeine Java-Themen 6
B Hilfe bei JUnit Test Allgemeine Java-Themen 1
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
A JUnit/Hashcode Problem Allgemeine Java-Themen 5
X Problem mit URLClassLoader und JUnit Allgemeine Java-Themen 3
N JUnit Allgemeine Java-Themen 13
M Junit Tests durchführen Allgemeine Java-Themen 18
M JVM Probleme JUnit Allgemeine Java-Themen 2
G NUnit Features in JUnit Allgemeine Java-Themen 2
darekkay (JUnit) Testdaten generieren - Framework? Allgemeine Java-Themen 2
A JUnit problem Allgemeine Java-Themen 9
T Organisation von Junit Testfällen? Allgemeine Java-Themen 2
M JUnit Tests vs. DBUnit Tests Allgemeine Java-Themen 3
P Klassen Junit test funktioniert nicht... Allgemeine Java-Themen 11
S Die Zeile die JUnit gerade ausführt lesen Allgemeine Java-Themen 15
aze JUnit: Testen ob bestimmte Exception nicht auftritt Allgemeine Java-Themen 18
U Fehler: Hauptklasse org.junit.runner.JUnitCore konnte nicht gefunden oder geladen werden Allgemeine Java-Themen 2
G JUnit Test Methoden in anderen Thread verlagern Allgemeine Java-Themen 4
J JUnit-Tests Zeichensatzproblem ? Allgemeine Java-Themen 2
J JUnit, TestCase vs "einfacher" Test Allgemeine Java-Themen 3
S [JUnit] Name von TestCase bekommen Allgemeine Java-Themen 4
1 JUnit Test Suit Allgemeine Java-Themen 2
T Junit-Tests in Java Klasse ausführen Allgemeine Java-Themen 26
J JUnit - werfen von Exceptions testen Allgemeine Java-Themen 17
M JUnit TestSuite erstellen Allgemeine Java-Themen 2
B JUnit und mehrere Instanzen der selben Applikation Allgemeine Java-Themen 4
G Testcases mit Junit auf private-Methode Allgemeine Java-Themen 7
G Input/Output System.in "umbiegen" für junit-Test Allgemeine Java-Themen 4
C JUnit und das Zulassen von RuntimeExceptions Allgemeine Java-Themen 5
ruutaiokwu junit mit annotations geht nicht? Allgemeine Java-Themen 5
T JUnit-Log auslesen Allgemeine Java-Themen 13
C JUnit Tests Allgemeine Java-Themen 4
fastjack JUnit Supplementary Classes Allgemeine Java-Themen 4
O Junit Reports / Logs als XML ohne Maven/Ant Allgemeine Java-Themen 7
M Junit und Mocks Allgemeine Java-Themen 5
fastjack jUnit und Test von equals, hashCode, toString Allgemeine Java-Themen 11
D junit - frage zu fixtures/test suites Allgemeine Java-Themen 11
A Seltsames Verhalten von JUnit-Tests im Zusammenspiel mit Ant Allgemeine Java-Themen 6
S JUnit: Erzeugen einer IOException Allgemeine Java-Themen 9
G JUnit Tests Allgemeine Java-Themen 7
G JUnit Test Allgemeine Java-Themen 5
S JUnit TesSuite und @Repeat Allgemeine Java-Themen 2
S JUnit Tests für GUI / Oberflächen Allgemeine Java-Themen 2
M Junit und Mocks bei JDBC Daos Allgemeine Java-Themen 8
M JUnit Problem mit AssertionFailedError Allgemeine Java-Themen 2
B Testfälle mit JUnit Allgemeine Java-Themen 4
S JUnit Allgemeine Java-Themen 15
N ClassNotFound Exception bei JUnit Test? Allgemeine Java-Themen 2
G ANT Tutorial . Schritte bzgl. Junit Bibliothek Allgemeine Java-Themen 4
A JUnit Reports zu groß für XSLT Allgemeine Java-Themen 4
M JUnit und dynamische Tests Allgemeine Java-Themen 11
P JUnit unter Eclipse: Problem mit Exception Allgemeine Java-Themen 8
GilbertGrape Warum schlägt JUnit-Test fehl? Allgemeine Java-Themen 19
K Bekomme JUnit TEst nicht zum laufen :( Allgemeine Java-Themen 9
K Junit: Frage zum Ablauf Allgemeine Java-Themen 3
K JUnit: Tests über ant aufrufen Allgemeine Java-Themen 2
S JUnit und EasyMock Allgemeine Java-Themen 7
B Wie alt ist JUnit? Allgemeine Java-Themen 2
A Junit Exceptions testen Allgemeine Java-Themen 3
P Testen mit JUnit Allgemeine Java-Themen 8
7 JUnit: Testproblem. Allgemeine Java-Themen 23
G Ant + JUnit Allgemeine Java-Themen 2
F JUnit unter Ant Allgemeine Java-Themen 3
S Integer zu int konvertieren - JUnit Allgemeine Java-Themen 12
G testen mit JUnit? Allgemeine Java-Themen 3
K JUnit 4 User Interaktion Allgemeine Java-Themen 7
M Ant + Junit + Testclass in Jar Allgemeine Java-Themen 3
G Junit 4 - TestSuite Allgemeine Java-Themen 6
B JUnit Allgemeine Java-Themen 2
T CheckStyle, JUnit und FindBugs aus Java-Programm starten Allgemeine Java-Themen 2
S JUnit will ins Netz! Allgemeine Java-Themen 2
B JUnit - Gleichen Test x-mal durchlaufen Allgemeine Java-Themen 2
F Hilfe: Adjazenzmatrix mittels JUnit testen. Allgemeine Java-Themen 2
H JUnit Allgemeine Java-Themen 5
N Problem mit Ant und JUnit Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben