Problem beim Testen von einer Spring-Anwendung

Status
Nicht offen für weitere Antworten.

damien

Aktives Mitglied
Hallo,

ich habe folgende kleine Testklasse:



Java:
/**
 * 
 */
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/RunNotifier;)Lorg/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)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:179)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

Woran kann das liegen ?
 
Zuletzt bearbeitet:
M

maki

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

damien

Aktives Mitglied
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
 
M

maki

Gast
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

Aktives Mitglied
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.
 
M

maki

Gast
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.:
Java:
        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

Aktives Mitglied
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.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben