Gleiche JUnit-Tests automatisert mit verschiedenen Methoden ausführen

flossy

Mitglied
Ich habe einige POJOs, die ich mit JUnit automatisiert testen möchte.
Alle Setter möchte ich wie folgt testen:
Java:
@Test (expected = IllegalArgumentException.class )
public void setValueWithNullPointerThrowsException() {
   MyPOJO p = new MyPOJO();
   p.setValue(null);
}
und alle Getter so:
Java:
@Test (expected = IllegalStateException.class)
public void getValueOnUnsetThrowsException() {
   MyPOJO p = new MyPOJO();
   p.getValue();
}

Gibt es die Möglichkeit dies automatisiert zu machen oder muss ich für jede Methode einen eigenen Test manuell schreiben?
 

kama

Top Contributor
Hallo,

also erstmal grundsätzlich würde ich mir sehr genau überlegen, ob ich getter/setter überhaupt teste....

Bei Deinem ersten setter ist die Frage was für fälle vorkommen können ? (setXXX (null) ?) und dann ?

Aber bei Deinem Getter habe ich ernste bedenken, da Du hier nicht den getter testest sondern mehr ob der Compiler bzw. die JVM hier eine Runtime Exception wirft....

Die Frage ist, ob Du das tatsächlich testen möchtest?

Oder geht es hier um andere Dinge?

Kannst Du vielleicht einen kleinen Code-Abschnitt (setter/getter) angeben, dann kann man vielleicht eher darauf antworten ?

MfG
Karl Heinz Marbaise
 

flossy

Mitglied
also erstmal grundsätzlich würde ich mir sehr genau überlegen, ob ich getter/setter überhaupt teste....

Bei Deinem ersten setter ist die Frage was für fälle vorkommen können ? (setXXX (null) ?) und dann ?
Naja, wenn ich möchte einfach dafür sorgen, dass kein Nullpointer übergeben wird. Und eine IllegalArgumentException ist doch aufschlussreicher als eine NullpointerException, oder täusche ich mich da?

Aber bei Deinem Getter habe ich ernste bedenken, da Du hier nicht den getter testest sondern mehr ob der Compiler bzw. die JVM hier eine Runtime Exception wirft....
Die Frage ist, ob Du das tatsächlich testen möchtest?
Nun, ich möchte eine Exception werfen, damit im Fehlerfall erkennbar ist, wo ein Zustand herrscht, der nicht sein dürfte, anstatt an einer ganz anderen Stelle eine NullpointerException zu bekommen, die dann wohl weniger aussagekräftig ist.

Oder geht es hier um andere Dinge?

Das Hauptziel ist die Softwarequalität/Stabilität/Zuverlässigkeit zu erhöhen. Hierzu versuche ich zu verstehen, wie das Fehlerhandling sinnvoll gestaltet werden kann. Siehe hierzu auch meine erste Frage: Fehlerhandling bei POJOs
Nachdem ich hin und wieder NullpointerExceptions zur Laufzeit bekam, die zunächst nicht so einfach zu deuten waren, fing ich an, bereits beim Setten/Getten Exceptions zu werfen, da ich somit sehr schnell sehen konnte, wo das Problem ist.
Vielleicht bin ich damit aber auch auf dem Falschen Wege?!

Kannst Du vielleicht einen kleinen Code-Abschnitt (setter/getter) angeben, dann kann man vielleicht eher darauf antworten ?
Hier ist ein Beispiel einer Nachricht, bei der der Header immer gesetzt sein sollte:
Java:
public class BasicMessageImpl implements BasicMessage{
	
	private byte[] userData = null;
	private BasicHeader header = null;		
	
	@Override
	public byte[] getData() {
		if(userData == null){
			throw new IllegalStateException("No user data has been set");
		}
		return userData;
	}

	@Override
	public void setData(byte[] data) {
		if( data == null ){
			throw new IllegalArgumentException("Data must not be null!");
		}
		this.userData = data;		
	}

	@Override
	public BasicHeader getBasicHeader() {	
		if(this.header == null){
			throw new IllegalStateException("Message header was not set");
		}
		return this.header;
	}

	@Override
	public void setBasicHeader(BasicHeader h) {
		
		if( h == null ){
			throw new IllegalArgumentException("Data must not be null!");
		}
		
		this.header = h;			
	}	
}
 

kama

Top Contributor
Hallo,

Naja, wenn ich möchte einfach dafür sorgen, dass kein Nullpointer übergeben wird. Und eine IllegalArgumentException ist doch aufschlussreicher als eine NullpointerException, oder täusche ich mich da?

Nun, ich möchte eine Exception werfen, damit im Fehlerfall erkennbar ist, wo ein Zustand herrscht, der nicht sein dürfte, anstatt an einer ganz anderen Stelle eine NullpointerException zu bekommen, die dann wohl weniger aussagekräftig ist.
Meist steht eine NPE nicht alleine und hat auch einen "caused by..." Teil mit dem man dem Problem meist sehr schnell auf die schliche kommt....ich gebe Dir allerdings recht, dass einen Entsprechende Exception hier aufschlussreicher wäre...


flossy hat gesagt.:
Das Hauptziel ist die Softwarequalität/Stabilität/Zuverlässigkeit zu erhöhen. Hierzu versuche ich zu verstehen, wie das Fehlerhandling sinnvoll gestaltet werden kann. Siehe hierzu auch meine erste Frage: Fehlerhandling bei POJOs
Nachdem ich hin und wieder NullpointerExceptions zur Laufzeit bekam, die zunächst nicht so einfach zu deuten waren, fing ich an, bereits beim Setten/Getten Exceptions zu werfen, da ich somit sehr schnell sehen konnte, wo das Problem ist.
Vielleicht bin ich damit aber auch auf dem Falschen Wege?!
Das Thema für Gründe etc. zu Unit Tests brauchen wir nicht zu diskutieren...

flossy hat gesagt.:
Java:
public class BasicMessageImpl implements BasicMessage{
	
	private byte[] userData = null;
	private BasicHeader header = null;		
	
	@Override
	public byte[] getData() {
		if(userData == null){
			throw new IllegalStateException("No user data has been set");
		}
		return userData;
	}

	@Override
	public void setData(byte[] data) {
		if( data == null ){
			throw new IllegalArgumentException("Data must not be null!");
		}
		this.userData = data;		
	}

	@Override
	public BasicHeader getBasicHeader() {	
		if(this.header == null){
			throw new IllegalStateException("Message header was not set");
		}
		return this.header;
	}

	@Override
	public void setBasicHeader(BasicHeader h) {
		
		if( h == null ){
			throw new IllegalArgumentException("Data must not be null!");
		}
		
		this.header = h;			
	}	
}
Dabei wäre meine Frage: Warum hat die Implementation keinen Konstruktor ? Oder war das nur exemplarisch gedacht ?

Weiterhin wäre die Frage: Wie bekommt die Klasse Ihre Werte? Per Spring (IoC) ? Wenn nicht könnte man die Datenübergabe im Konstruktor machen und dann im Konstruktor die Tests machen und somit die Getter/Setter vereinfachen....oder man eliminiert die Setter ganz (Werden die Setter überhaupt benötigt ?)...?

Weiterhin kommt mir dabei der Gedanke, dass Du ja gegen ein Interface implementiert hast. Da wäre zu bemerken, dass ein Interface ja eine Abmachung darstellt. Das Problem, dass dabei auftaucht ist, dass Du jetzt für jede Implementierung die ganzen Implementierungen Testen musst....je mehr Implementierung Du hast desto mehr Tests schreibst Du und vor allem der Test Code ist faktisch immer identisch....Das könnte man vereinfachen, in dem man eine Abstrakte Klasse mit den Tests schreibt und für die implementationen ableitet und dort eine Methode überschreibt, die eine Instanz der jeweiligen Implementierung liefert...das Reduziert die Arbeit und vor allem schreibt man keinen Code doppelt (DRY)...

Eine weitere Frage ist, dass bei der Verwendung eines getters der Nutzer eigentlich ja mit den Rückgaben oder auch nicht Rückgaben (null) zurecht kommen muss...(siehe auch Interface Vereinbarung)....Das bedeutet meiner Meinung nach, dass man hier den Nutzer Testen muss, ob der mit den entsprechenden Rückgaben aus dem Objekt klar kommt oder nicht....Hängt aber auch von der Anwendung ab....Hier kommt man leicht zu dem Thema Mocking/Stubs etc.

MfG
Karl Heinz Marbaise
 

flossy

Mitglied
Dabei wäre meine Frage: Warum hat die Implementation keinen Konstruktor ?
Hmm...stimmt, das wäre gar nicht schlecht einen zu erstellen ;-)

Weiterhin wäre die Frage: Wie bekommt die Klasse Ihre Werte? Per Spring (IoC) ?
Nein, die Werte werden "manuell" gesetzt. Spring möchte ich nicht verwenden, wobei IoC an sich vielleicht möglich wäre, doch da kenne ich mich noch nicht so gut aus.

Wenn nicht könnte man die Datenübergabe im Konstruktor machen und dann im Konstruktor die Tests machen und somit die Getter/Setter vereinfachen....
ja das stimmt:
Java:
public BasicMessageImpl( BasicHeader h ){
	if( h == null ){
		throw new IllegalArgumentException("Basic header must not be null!");
	}
	this.header = h;
}

oder man eliminiert die Setter ganz (Werden die Setter überhaupt benötigt ?)...?
Hmm...nein, eigentlich nicht, wenn ich ja jetzt mit dem Konstruktor die Daten setzte. Wenn ich jedoch auf die Idee kommen sollte, im Nachhinein den Header zu wechseln, dann muss ich Folgendes machen:
Java:
BasicMessage basicMessageA = BasicMessageImpl(headerA);
// do something ...
// change header
BasicMessage basicMessageB = BasicMessageImpl(headerB);
basicMessageB.setData(basicMessageA.getData);
basicMessageA = basicMessageB;
anstatt einfach
Java:
BasicMessage basicMessageA = BasicMessageImpl(headerA);
// do something ...
// change header
basicMessageA.setHeader(headerB);

Weiterhin kommt mir dabei der Gedanke, dass Du ja gegen ein Interface implementiert hast. Da wäre zu bemerken, dass ein Interface ja eine Abmachung darstellt. Das Problem, dass dabei auftaucht ist, dass Du jetzt für jede Implementierung die ganzen Implementierungen Testen musst....je mehr Implementierung Du hast desto mehr Tests schreibst Du und vor allem der Test Code ist faktisch immer identisch....Das könnte man vereinfachen, in dem man eine Abstrakte Klasse mit den Tests schreibt und für die implementationen ableitet und dort eine Methode überschreibt, die eine Instanz der jeweiligen Implementierung liefert...das Reduziert die Arbeit und vor allem schreibt man keinen Code doppelt (DRY)...
gute Idee! Das probiere ich gleich mal.

UPDATE:
Es hat geklappt :) Danke!
Java:
public abstract class AbstractBasicMessageTest {

	private BasicMessage msg;
	
	public abstract BasicMessage getBasicMessage();

	@Before
	public void createMessage(){
		msg = getBasicMessage();
	}
	
	@Test
	public void setDataEqualsGetData() {	
		byte testData[] = new byte[4];
		testData[0] = 7;
		testData[3] = 0x0f;		
		msg.setData(testData);		
		assertEquals(testData,msg.getData());
	}

	@Test (expected = IllegalArgumentException.class)
	public void setDataWithNullThrowsException() {					
		msg.setData(null);					
	}
	
	@Test (expected = IllegalStateException.class)
	public void getDataOnUnsetThrowsException() {						
		msg.getData();					
	}
}

Eine weitere Frage ist, dass bei der Verwendung eines getters der Nutzer eigentlich ja mit den Rückgaben oder auch nicht Rückgaben (null) zurecht kommen muss...(siehe auch Interface Vereinbarung)....Das bedeutet meiner Meinung nach, dass man hier den Nutzer Testen muss, ob der mit den entsprechenden Rückgaben aus dem Objekt klar kommt oder nicht....
Ja, damit wären wir wieder bei der Diskussion: Fehlerhandling bei POJOs :(

Könnte man vielleicht sagen, Setter werfen im Fehlerfall Exceptions und jegliche Nutzer der Objekte müssen auf den Umgang mit fehlerhaften Werten getestet werden (also quasi anstatt den Exceptions bei den Gettern )?
 
Zuletzt bearbeitet:

byte

Top Contributor
Du kannst das gewünschte relativ einfach mit Reflection realisieren. Dann musst Du nicht jeden Setter manuell testen. Einfach alle Methoden der Klasse durchgehen und falls Setter, dann Aufruf der Methode mit null Parameter + entsprechendes assert.
 

flossy

Mitglied
Du kannst das gewünschte relativ einfach mit Reflection realisieren.
Ja, das ist eine Idee. etwa so?
Java:
@Test (expected = IllegalStateException.class)
public void testGetterOnUnsetData() throws Throwable {
	Method[] methods = msg.getClass().getMethods();
        for(Method m : methods){
		if(m.getName().contains("get")){
			try {
				m.invoke(msg, null);
			} catch (IllegalArgumentException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				throw e.getTargetException();
			}		
		}
	}				
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Gleiche Klassen und Methoden in unterschiedlichen Projekten nutzen Java Basics - Anfänger-Themen 2
berserkerdq2 Spiel hängt sich immer in der 4 Runde auf, obwohl ich jede Runde das gleiche mache Java Basics - Anfänger-Themen 1
berserkerdq2 Ist JVM das gleiche wie IJVM (Bytecode) Java Basics - Anfänger-Themen 1
J Kreis soll die gleiche Fläche wie das Rechteck haben wie mache ich das? Java Basics - Anfänger-Themen 3
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
B Jsoup: gleiche Session nutzen Java Basics - Anfänger-Themen 0
tom.j85 Doppelte Foreach Schleife: Am Ende wird immer das Gleiche Objekt eingefügt Java Basics - Anfänger-Themen 4
X Textdatei: zwei-zeilenweise gleiche Zeilen rausschmeißen Java Basics - Anfänger-Themen 21
CptK Interface Beide Panels zeigen das Gleiche Java Basics - Anfänger-Themen 2
J Gleiche Methode in 2 verschiedenen Klassen - Lösung ? Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
O Problem gleiche Zahlen Java Basics - Anfänger-Themen 2
F Immer wieder gleiche Zufallszahl? Java Basics - Anfänger-Themen 4
N Array gleiche Datentypen zusammenrechnen Java Basics - Anfänger-Themen 28
T Classpath Zwei gleiche Dateinamen in verschiedenen Projekten möglich? Java Basics - Anfänger-Themen 13
L Gleiche Werte aus Array aussortieren Java Basics - Anfänger-Themen 5
L Gleiche Werte im Array hochzählen Java Basics - Anfänger-Themen 4
J Methoden Zwei Methoden die fast das gleiche tun organisieren Java Basics - Anfänger-Themen 3
L Classpath Zwei Bibliotheken enthalten gleiche .class Datei Java Basics - Anfänger-Themen 6
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
H überprüfen ob in Array gleiche int-Zahlen gespeichert werden. Java Basics - Anfänger-Themen 7
K Das Gleiche wiederholen Java Basics - Anfänger-Themen 5
Y Gleiche Arrays aus einem Array mit Objekten Java Basics - Anfänger-Themen 5
O Klasse in ArrayList speichern Problem -gleiche Speicheradresse Java Basics - Anfänger-Themen 2
M Zwei gleiche Eintraege in ArrayList finden Java Basics - Anfänger-Themen 15
D Javaliste auf gleiche Einträge überprüfen Java Basics - Anfänger-Themen 2
E Input/Output Drucken am Mac immer gleiche Schriftgröße?!? Java Basics - Anfänger-Themen 2
I immer die gleiche Zufallszahl Java Basics - Anfänger-Themen 9
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
M Erste Schritte Eclipse führt immer das gleiche Programm aus Java Basics - Anfänger-Themen 6
J Objekterzeugung im Konstruktor - Mehrfach gleiche Referenzvariable? Java Basics - Anfänger-Themen 4
A Mehrere Gegner sollen das gleiche Bild benutzen Java Basics - Anfänger-Themen 3
W JButton in gleiche Größe bringen Java Basics - Anfänger-Themen 4
M gleiche Box in GUI mehrmals verwenden Java Basics - Anfänger-Themen 5
A objekt innerhalb der gleiche klasse Java Basics - Anfänger-Themen 10
S Dasselbe ist nicht das gleiche? Java Basics - Anfänger-Themen 7
K Datentypen Gleiche Zufallszahlen in verschiedenen Datenstrukturen Java Basics - Anfänger-Themen 6
G Gleiche Elemente in Feld zählen Java Basics - Anfänger-Themen 13
B 2D-Array, gleiche Einträge prüfen Java Basics - Anfänger-Themen 5
B Random() gleiche Zahlen ausschließen Java Basics - Anfänger-Themen 30
J Datentypen List - gleiche Einträge bei neuen Objekten Java Basics - Anfänger-Themen 31
N Threads: 4 Threads, 4mal Zugriff auf Array soll nicht der gleiche Zugriff sein Java Basics - Anfänger-Themen 4
S OOP Warum gleiche Instanz der Klasse? (Factory-Muster) Java Basics - Anfänger-Themen 13
O Zweidemensionales Array auf zwei gleiche Zahlen prüfen Java Basics - Anfänger-Themen 15
D Methode in einer anderen Methode (gleiche Klassse) aufrufen Java Basics - Anfänger-Themen 11
G Der Gleiche oder der Selbe? Java Basics - Anfänger-Themen 6
G Zählen gleiche Werte in Array Java Basics - Anfänger-Themen 5
Gama 2 (fast) gleiche Dateien - nur eine funktioniert Java Basics - Anfänger-Themen 2
B Gleiche Ordner löschen Java Basics - Anfänger-Themen 15
V Vector/Arraylist hat nur gleiche Einträge Java Basics - Anfänger-Themen 3
G Warum das Prog mehrmals das gleiche macht wegen ItemListener Java Basics - Anfänger-Themen 4
Z Feld prüfen ob 3 gleiche zahlen nach einander vorkommen Java Basics - Anfänger-Themen 3
E Gleiche Methode einer (Kinds?)Klasse erneut aufrufen Java Basics - Anfänger-Themen 2
G gleiche Strings ungleich? Java Basics - Anfänger-Themen 5
K Neue Werte für gleiche Array-Indexe Java Basics - Anfänger-Themen 16
G Gleiche Aktionen verarbeiten (aber nur einmal Code)? Java Basics - Anfänger-Themen 2
M bewirken diese Schreibweisen das gleiche? :) Java Basics - Anfänger-Themen 8
F zugriff auf gleiche klasse aus mehreren klassen. Java Basics - Anfänger-Themen 3
G 2 gleiche Strings Java Basics - Anfänger-Themen 2
Z Vector führt mehrer, aber gleiche Elemente Java Basics - Anfänger-Themen 6
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
hello_autumn Klassen Anzahl sowie die Anzahl der Junit Tests ermitteln? Java Basics - Anfänger-Themen 8
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

Ähnliche Java Themen

Neue Themen


Oben