2013-07-12 7 views
28

ich testen Sie die folgenden DAO mit JUnit:Frühling autowiring nicht in Unit-Tests mit JUnit

@Repository 
public class MyDao { 

    @Autowired 
    private SessionFactory sessionFactory; 

    // Other stuff here 

} 

Wie Sie sehen können, die session ist autowired Frühling verwenden. Wenn ich den Test ausführe, bleibt sessionFactory null und ich bekomme eine Nullzeigerausnahme.

Dies ist die session Konfiguration im Frühjahr:

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="configLocation"> 
     <value>classpath:hibernate.cfg.xml</value> 
    </property> 
    <property name="configurationClass"> 
     <value>org.hibernate.cfg.AnnotationConfiguration</value> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">${jdbc.dialect}</prop> 
      <prop key="hibernate.show_sql">true</prop> 
     </props> 
    </property> 
</bean> 

Was ist los? Wie kann ich das Autowiring auch für Unit-Tests aktivieren?

Update: Ich weiß nicht, ob es die einzige Möglichkeit ist, JUnit-Tests auszuführen, aber beachte, dass ich es in Eclipse ausführe, indem ich mit der rechten Maustaste auf die Testdatei klicke und "Ausführen als" -> "JUnit-Test" wähle "

+0

Ist 'MyDao' im Scan-Pfad enthalten? – Reimeus

+0

Ja, es ist enthalten – user1883212

+0

Was ist mit ''? Hast du deine XMLs? –

Antwort

24

hinzufügen, so etwas zu Ihrer root-Unit-Test-Klasse:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration 

Dies wird die XML in Ihrem Standard-Pfad verwenden. Wenn Sie einen nicht standardmäßigen Pfad angeben müssen, können Sie der ContextConfiguration-Annotation eine locations-Eigenschaft zuweisen.

http://static.springsource.org/spring/docs/2.5.6/reference/testing.html

+0

Ich kann diese Annotationen nicht sehen und einfügen – user1883212

+0

Was meinst du? –

+0

Ok Ich musste nur etwas in den Pom einfügen, um die Annotation verwenden zu können. Jetzt, wo ich sie hinzugefügt habe, bekomme ich Dieser Fehler: java.lang.IllegalStateException: Weder GenericXmlContextLoader noch AnnotationConfigContextLoader konnten Standardwerte erkennen, und für die Kontextkonfiguration wurden keine ApplicationContextInitializer deklariert [ContextConfigurationAttributes @ 1dd58d8 declaringClass = 'org.davis.dao.EmployeeDAOImplTest', locations = '{}', classes = '{}', inheritLocations = true, initializers = '{}', inheritInitializers = true, name = [null], contextLoaderClass = 'org.springframework.t ... – user1883212

2

Sie müssen Anmerkungen zum Junit Klasse hinzuzufügen, es erzählt die SpringJunitRunner zu verwenden. Die gewünschten Werte sind:

@ContextConfiguration("/test-context.xml") 
@RunWith(SpringJUnit4ClassRunner.class) 

Das weist Junit an, die Datei test-context.xml im gleichen Verzeichnis wie Ihr Test zu verwenden. Diese Datei sollte der echten context.xml ähnlich sein, die Sie für den Frühling verwenden, aber natürlich auf Testressourcen verweisen.

6

benötigen Sie den Frühling JUnit runner, um Draht in Spring Bohnen aus Ihrem Kontext zu verwenden. Der folgende Code geht davon aus, dass Sie einen Anwendungskontext namens testContest.xml auf dem Testklassenpfad verfügbar haben.

import org.hibernate.SessionFactory; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.test.context.ContextConfiguration; 
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 
import org.springframework.transaction.annotation.Transactional; 

import java.sql.SQLException; 

import static org.hamcrest.MatcherAssert.assertThat; 
import static org.hamcrest.Matchers.startsWith; 

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = {"classpath*:**/testContext.xml"}) 
@Transactional 
public class someDaoTest { 

    @Autowired 
    protected SessionFactory sessionFactory; 

    @Test 
    public void testDBSourceIsCorrect() throws SQLException { 
     String databaseProductName = sessionFactory.getCurrentSession() 
       .connection() 
       .getMetaData() 
       .getDatabaseProductName(); 
     assertThat("Test container is pointing at the wrong DB.", databaseProductName, startsWith("HSQL")); 
    } 
} 

Hinweis: Dies funktioniert mit Frühling 2.5.2 und Hibernate 3.6.5

+0

Das Problem besteht darin, den richtigen Pfad zu verstehen. Ich habe meine servlet-context.xml unter src/main/webapp/WEB-INF/spring-servlet.xml und verwende diesen Ort: @ContextConfiguration (locations = {"classpath: spring-servlet.xml"}) Aber das funktioniert nicht. Was soll ich stattdessen schreiben? – user1883212

+0

Sind meine Pfade korrekt? – user1883212

+0

Ich habe versucht alle möglichen Wege, was ist los mit dieser App? – user1883212

6

Fehlender Kontext Speicherort in der Konfiguration kann dies dazu führen, ein Ansatz, dieses Problem zu lösen:

  • Angeben der Position der Kontextdatei in ContextConfiguration

wie:

@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" }) 

Mehr Details

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { "classpath:META-INF/your-spring-context.xml" }) 
public class UserServiceTest extends AbstractJUnit4SpringContextTests {} 

Referenz: Thanks to @Xstian

Verwandte Themen