Best Practice JUnit: Wie Klassen durch Stubs/Mockups ersetzen

T

trez

Gast
Hallo

Wie führe ich Unittests einer Klasse durch, welche andere Klassen verwendet, welche ich aber durch Fake-Klassen ersetzen will?

Ich möchte ja nicht bei jedem Test manuell Dateien ersetzen und die ersetzen. Die Fake-Klassen sind möglicherweise nicht bei allenTests dieselben Dateien, aber auch das ist kein Muss, das kann ich auch anders lösen

Wie macht ihr das konkret?
Per Script alles was man brauch zusammenkopieren?
Wie Fake ich Klassen die nicht mir gehören? (z.B. File ...)

Unten ein extrem abgespecktes Beispiel, das mit Fakes von ClassOne und ClassThree gestestet werden soll.

Java:
package test.package2;

import test.package1.ClassOne;
import test.package3.ClassThree;

public class ClassTwo {

	ClassOne c1;
	ClassThree c3;

	public ClassTwo() {
		c1 = new ClassOne();
		c3 = new ClassThree();
	}
	
	public void doIt() {
		if (c1.getFlag()) {
			c3.setValue(42);
		} else {
			c3.setValue(24);
		}
	}
}

Google-Stichworte?
Links auf Beschreibungen?

Besten Dank
trez
 
T

trez

Gast
Danke - ich bin am lesen. Ich kann den Aufwand noch nicht abschätzen und sehe auch noch nicht so genau wie ein Framework die Build-Pfade "umbiegen" kann. (Die Originalklassen sind bei uns hier auch im Build-Pfad)

Gibt es als Alternative möglicherweise ein Lösung per Script (Ant? Maven?) vor Testbeginn die Dateien zu kopieren?
(Da bin ich auch nicht der Guru)

[Edit] Mockito scheint eine Schicht zwischen die UUT und den verwendeten Klassen zu legen und das wäre nicht das, was ich möchte. Ich möchte, dass zur Testzeit eine anderer Sourcecode von ClassOne und ClassThree verwendet wird.

Nach einer halben Stunde lesen bin ich zur erwähnten Erkenntnis gelangt - gegen mögliche Blindheit hilft vielleicht ein Zaunpfahl
 
Zuletzt bearbeitet von einem Moderator:
T

trez

Gast
Meine Erkenntnisse nach dem Wochenende:

Mockito erzeugt eine Klasse nach einem Interface, welche der UUT übergeben wird.
So wird es wenigstens in den Beispielen gemacht, die ich gefunden habe.

Ich habe keine Interfaces (könnte ich zwar ändern) und die Instanzen werden direkt in der UUT erzeugt.

Was gibt es für einen Weg den Code der verwendeten Klassen für die Tests zu ersetzen?
 

turtle

Top Contributor
Du kannst deine realen Klassen von aussen reinreichen ("Injizieren") Dazu solltest du deinen Code "testbarer" machen;)
Java:
public class TestClassTwo {

    @Test
    public void test() {
	ClassTwo classTwo = new ClassTwo(new FakeClassOne(), new FakeClassThree());
	classTwo.doTest();
    }

}

class ClassOne {

}

class ClassThree {

}

class ClassTwo {
    private ClassOne classOne;
    private ClassThree classThree;

    public ClassTwo(ClassOne classOne, ClassThree classThree) {
	this.classOne = classOne;
	this.classThree = classThree;

    }
}

Damit kannst du es einem DI-Framework überlassen, die Abhängigkeiten aufzulösen (Spring, Guice,...) oder wie hier selbst im Test machen.
 
Zuletzt bearbeitet:

Flown

Administrator
Mitarbeiter
Also wie turtle schon gesagt hat, du musst deine Klasse testbarer machen. Er hat dir auch schon ein Bsp. gegeben, dass du zum Beispiel einen Konstruktor mehr machst und die zwei Objekte mitgibst. In deiner Konfiguration ist es nicht möglich das Verhalten von deinen zwei internen Objekten direkt zu testen.
 

Flown

Administrator
Mitarbeiter
Also um das zu konkretisieren habe ich dir dein Beispiel mit EasyMock aufbereitet:

TestClassTwo.java
Java:
package mock;

import static org.easymock.EasyMock.*;
import static org.junit.Assert.*;

import org.easymock.EasyMockRunner;
import org.easymock.EasyMockSupport;
import org.easymock.Mock;
import org.easymock.TestSubject;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;

@RunWith(EasyMockRunner.class)
public class TestClassTwo extends EasyMockSupport {
	
	@Mock ClassOne classOne;
	@Mock ClassThree classThree;
	
	@TestSubject
	ClassTwo classTwo;

	@Before
	public void setUp() {
		classTwo = new ClassTwo(classOne, classThree);
	}
	
	@After
	public void tearDown() {
		classTwo = null;
	}
	
	@Test
	public void testFlagTrue() {
		expect(classOne.getFlag()).andStubReturn(true);
		classThree.setValue(42);
		replayAll();
		classTwo.doIt();		
		assertTrue(classOne.getFlag());
	}
	
	@Test
	public void testFlagFalse() {
		expect(classOne.getFlag()).andStubReturn(false);
		classThree.setValue(24);
		replayAll();
		classTwo.doIt();
		assertFalse(classOne.getFlag());
	}
}

ClassOne.java
Java:
package mock;

public class ClassOne {
	
	private boolean flag;
	
	public ClassOne() {
		flag = false;
	}
	
	public void setFlag(boolean flag) {
		this.flag = flag;
	}
	
	public boolean getFlag() {
		return flag;
	}
}

ClassTwo.java

Java:
package mock;

public class ClassTwo {
	
	private ClassOne classOne;
	private ClassThree classThree;
	
	public ClassTwo() {
		classOne = new ClassOne();
		classThree = new ClassThree();
	}
	
	public ClassTwo(ClassOne classOne, ClassThree classThree) {
		this.classOne = classOne;
		this.classThree = classThree;
	}
	
	public void doIt() {
		if(classOne.getFlag()) {
			classThree.setValue(42);
		}
		else {
			classThree.setValue(24);
		}
	}
}

ClassThree.java

Java:
package mock;

public class ClassThree {
	private int value;
	
	public ClassThree() {
		value = 0;
	}
	
	public void setValue(int value) {
		this.value = value;
	}
	
	public int getValue() {
		return value;
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
V JUnit Klassen Java Basics - Anfänger-Themen 3
K JUnit: Objekte von eigenen Klassen vergleichen...geht nicht Java Basics - Anfänger-Themen 5
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
6 Best Practice Feedback zu Service / JUnit Tests Java Basics - Anfänger-Themen 3
M Anfängerfehler - Tests JUnit IntelliJ Java Basics - Anfänger-Themen 24
D Cannot find JUnit.framework Java Basics - Anfänger-Themen 1
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
U JUnit testen auf SomeException Java Basics - Anfänger-Themen 5
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
A JUnit testing is inkonsistent Java Basics - Anfänger-Themen 12
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
P Probleme mit JUnit-Tests, es kommt was anderes raus als bei manuellen Tests Java Basics - Anfänger-Themen 5
Y Wie kann ich Konsoleneingaben durch den Scanner mit JUnit 4 testen? Java Basics - Anfänger-Themen 1
B JUnit 4: Wie man die eigene Liste testen kann [TDD] Java Basics - Anfänger-Themen 46
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
W JUnit Tests Java Basics - Anfänger-Themen 4
B JUnit / Exceptions/ try-catch Java Basics - Anfänger-Themen 6
L JUnit tests in java Java Basics - Anfänger-Themen 5
N JUnit und private Methoden testen. Java Basics - Anfänger-Themen 9
F JUnit - Was ist mit "side effects" gemeint ? Java Basics - Anfänger-Themen 2
H JUnit in Eclipse: java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 9
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
L Junit Testing bei XML? Java Basics - Anfänger-Themen 3
J LocalDateTime testen mit Junit Java Basics - Anfänger-Themen 20
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
A Objekt in Methode zurückgeben, JUnit zeigt Error Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
O JUnit - Objektreferenzen Java Basics - Anfänger-Themen 3
G Testen mit JUnit Java Basics - Anfänger-Themen 4
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
C JUnit Tests. How to Java Basics - Anfänger-Themen 5
S Junit Test Java Basics - Anfänger-Themen 2
shiroX Klassen Klasse/Methode private final jUnit-Fehler Java Basics - Anfänger-Themen 5
L Junit Tests Java Basics - Anfänger-Themen 10
A IllegalArgumentException in JUnit testen Java Basics - Anfänger-Themen 3
V ToString-Methode mit JUnit testen(BlueJ) Java Basics - Anfänger-Themen 10
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
T Junit Mockito: Instanz von inneren erzeugten Objekten Java Basics - Anfänger-Themen 4
S JUnit - Swing- Anwendung wird nicht neu gestartet Java Basics - Anfänger-Themen 0
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
S Kommt es zu Seiteneffekten wenn man waehrend den laufenden JUnit Tests den Code aendert? Java Basics - Anfänger-Themen 2
M JUnit Testmethoden mit mehreren assert Methoden Java Basics - Anfänger-Themen 1
S Double und Gleitkommazahlen mit JUnit testen Java Basics - Anfänger-Themen 7
Z JUnit Exception Java Basics - Anfänger-Themen 2
M Verständnisfrage zu JUnit Tests und private Methoden Java Basics - Anfänger-Themen 3
M Ist die Hamcrest Bibliothek auch schon in Junit 4.11 verfügbar? Java Basics - Anfänger-Themen 1
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
M Reihenfolge von Testmethoden in JUnit beeinflussen Java Basics - Anfänger-Themen 2
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
G JUnit-Tests im Programmdurchlauf starten Java Basics - Anfänger-Themen 4
T JUnit test failed Java Basics - Anfänger-Themen 3
M Junit Tests durchführen, die eine Verbindung zu einer Daten erfordern Java Basics - Anfänger-Themen 3
T Junit in Eclipse Java Basics - Anfänger-Themen 1
P JUnit bedeutungen Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
S JUnit assertEquals funktioniert nichgt wie es sollte :( Java Basics - Anfänger-Themen 7
V Frage zu JUnit Tests Java Basics - Anfänger-Themen 3
B JUnit für JFileChooser Java Basics - Anfänger-Themen 6
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
S File vergleich - Junit Java Basics - Anfänger-Themen 6
T JUnit Java Basics - Anfänger-Themen 18
G Junit Java Basics - Anfänger-Themen 4
X JUnit testing Java Basics - Anfänger-Themen 7
T JUnit Suite frage Java Basics - Anfänger-Themen 6
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
S InvocationTargetException bei JUnit Testlauf Java Basics - Anfänger-Themen 2
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
T Junit --Exception testen Java Basics - Anfänger-Themen 15
A JUnit Tests in Jar-Archiv packen Java Basics - Anfänger-Themen 2
G Erste Schritte JUNIT Regressionstests automatisieren Java Basics - Anfänger-Themen 2
M JUnit - nur einzelne Methode testen? Java Basics - Anfänger-Themen 4
M JUnit - nur Failures loggen? Java Basics - Anfänger-Themen 2
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
R String Replace für JUnit Java Basics - Anfänger-Themen 19
T JUNIT Nullpointerexception Java Basics - Anfänger-Themen 3
M JUNIT tests mit ant script ausführen Java Basics - Anfänger-Themen 4
S [JUnit] eigener Testsuite Runner + Ausgabe Java Basics - Anfänger-Themen 6
S [JUnit] Print Results while running Java Basics - Anfänger-Themen 6
W Mit jUnit Array testen? Java Basics - Anfänger-Themen 5
T Junit Tests Java Basics - Anfänger-Themen 7
I JUnit Datapoints für mehrere Testklassen Java Basics - Anfänger-Themen 4
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
M Junit tests gehen nicht Java Basics - Anfänger-Themen 2
E OOP einfache Array Aufgabe mit jUnit Java Basics - Anfänger-Themen 5
L JUNIT Testing Java Basics - Anfänger-Themen 3
C jUnit: Erfahren, ob der getestete Code eine Exception gehandelt hat Java Basics - Anfänger-Themen 3
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
turmaline JUnit testen ob keine Exception auftritt Java Basics - Anfänger-Themen 23
D JUnit auf Matrix anwenden Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben