# Problem beim Testen von einer Spring-Anwendung



## damien (15. Sep 2009)

Hallo,

ich habe folgende kleine Testklasse:




```
/**
 * 
 */
package de.webshop.test;

import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.junit.Assert.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;

import de.webshop.kundenverwaltung.pojo.Kunde;
import de.webshop.kundenverwaltung.repository.KundeNotFoundException;
import de.webshop.kundenverwaltung.service.IKundenverwaltungService;

/**
 * @author X
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="/config/test.xml")
@Transactional
@TransactionConfiguration(defaultRollback=false)
public class KundenverwaltungTest {
	
	private static final Logger LOGGER = LoggerFactory.getLogger(KundenverwaltungTest.class);
	private static final boolean DEBUG = LOGGER.isDebugEnabled();
	
	@Autowired 
	private IKundenverwaltungService kv;
	
	private static final Long KUNDE_ID_VORHANDEN = Long.valueOf(1);
	
	@Test
	public void findKundeMitIdVorhanden() throws KundeNotFoundException {
		
		if (DEBUG) LOGGER.debug("BEGINN findKundeMitIdVorhanden");
		
		final Long id = KUNDE_ID_VORHANDEN;
		
		final Kunde kunde = kv.findKundeById(id);
		
		assertThat(kunde, is(notNullValue()));
		assertThat(kunde.getId(), is(id));
		
		if (DEBUG) LOGGER.debug("ENDE findKundeMitIdVorhanden");
		
	}

}
```

Bekomme beim Ausführen folgende Info in der Logdatei:



> 2009-09-15 20:23:19,877 INFO  org.springframework.test.context.TestContextManager - @TestExecutionListeners is not present for class [class de.webshop.test.KundenverwaltungTest]: using defaults.



Stacktrace:



> java.lang.IllegalAccessError: tried to access method org.junit.runners.BlockJUnit4ClassRunner.makeNotifier(Lorg/junit/runners/model/FrameworkMethod;Lorg/junit/runner/notification/RunNotifierLorg/junit/internal/runners/model/EachTestNotifier; from class org.springframework.test.context.junit4.SpringJUnit4ClassRunner
> at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
> at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
> ...



Woran kann das liegen ?


----------



## maki (15. Sep 2009)

Welche Springversion nutzt du?
Welche JUnit Version?
Wie startest du die Tests?


----------



## damien (15. Sep 2009)

Spring 3.0.0 M2 und M3 getestet.
JUnit 4.5 und 4.7 getestet.

Starten tu ich sie mit Run as JUnit Test als VM Argument folgendes:

-javaagent:C:/Software/spring/dist/org.springframework.instrument-VERSION.jar


----------



## maki (15. Sep 2009)

[#SPR-5995] JUnit 4.5 support broken - Spring Projects Issue Tracker

Scheint als ob es noch einen Bug in der Spring Unterstützung von JUnit gibt, wird allerdings schon dran gearbeitet.


----------



## damien (15. Sep 2009)

Ok das habe ich gesehen, müsste doch dann aber mit älteren Versionen laufen ?


----------



## maki (15. Sep 2009)

Hast du schon den M4 von Spring 3 getestet?
Ansonsten würde ich versuchen alles was du nicht brauchst rauszuwerfen (@Transactional, @TransactionConfiguration, Logger -wozu denn auch?  )


----------



## damien (15. Sep 2009)

Also Spring M3 und JUnit 4.6 funktioniert, danke.

Das Logging brauche ich schon, hilft mir beim Fehler finden 

Ohne @Transactional usw. funktioniert das doch garnicht.


----------



## maki (15. Sep 2009)

Ok, @Transactional  inkl. Config sollte dann natürlich bleiben.
Logging? Ich verstehe nicht wie einem das bei der Fehlersuche helfen soll, dachte das es reicht wenn es heisst das der Test findKundeMitIdVorhanden fehlgeschlagen ist, zusätzlich mit sprechenden Messages, also zB.:

```
assertThat("kunde is null", kunde, is(notNullValue()));
        assertThat("wrong id", kunde.getId(), is(id));
```
Klar braucht man manchmal ein paar Ausgaben, aber doch nur Temporär auf Sys.out oder Sys.err, nicht länger imho, schliesslich sollen die Tests sich selbst prüfen und im Fehlerfall genug infos mitliefern, zuviel Logging versperrt die Sicht aufs wesentliche.

Würde mich dafür interessieren wie du deine Testdaten in die Db bekommst, ich nutze dafür DBUnit.


----------



## damien (16. Sep 2009)

Ich würde sagen das ist alles Ansichtssache 

Ich arbeite mit ANT, hab da meine vorgefertigten *.csv Dateien und meine build.xml mit bspw. einem reload-Task, den ich dann in eclipse ausführe.


----------

