2013-03-22 5 views
5

Wir haben große Anwendung im Frühling 3 geschrieben. Ich muss JUnit Test überprüfen Verhalten eines Dienstes schreiben. Es ist keine Einheit, sondern Teil eines Systems. Es gibt einige Dienste und Repositories, die zusammen arbeiten -> viele injizierte Bohnen drin. Die App nutzt auch Aspekte.JUnit Test im Frühjahr - überschreiben und ignorieren Bohnen aus der Anwendung andere Konfigurationsklassen

Meine Frage ist. Wie man Config und Beans in diesem Fall von Tests verwaltet? Ich muss in App-Konflikten definierte Beans verwenden und in Beans nur Beans definieren, die Persistenz verwenden, um mit einer eingebetteten Datenbank zu arbeiten. Also muss ich Beans von src verwenden, wie sie definiert sind und überschreiben nur einige verursachende Probleme (Persistance Beans, Beans mit Webservices, ...) Im Testpaket habe ich Konfig-Klasse-Definition-Beans für persistance gemacht, mit Datenquelle für hsql. Aber ich weiß nicht was als nächstes. Ich habe versucht, Test-config-Klasse mit annotieren:

@Configuration 
@EnableAspectJAutoProxy 
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ, proxyTargetClass = true) 
@ComponentScan(basePackages = "com.example.our.app") 
public class MyTestConfig implements TransactionManagementConfigurer { 

zu scannen gesamte Anwendung und verwenden Konfiguration von Bohnen aus src Ordner. Dies führt jedoch auch dazu, dass Konfigurationen aus anderen Tests Probleme verursachen. Ist das Ganze eine gute Strategie oder nicht? Was nun - Verwenden Sie excludeFilters, um andere Testkonfigurationen zu entfernen? Oder ist diese Strategie ganz schlecht?

dank

Antwort

2

Ich denke hier beste Weg Spring profiles zu bedienen ist. Überprüfen Sie here now to use H2 for tests mit Profilen.

+0

Ja guter Punkt außer Kraft setzen, aber Sie müssen um die Konfiguration von applicationContext.xml nach Java zu verschieben – vsingh

2

Sie können Beans selektiv mit der Kontextverschmelzungsfunktionalität überschreiben, die von der @ContextHierarchy Annotation bereitgestellt wird.

Um diese Funktion für Ihren Anwendungsfall erhalten Sie einen Basis Kontext zu schaffen, die für Frühling Bohnen App scannt:

@Configuration 
@ComponentScan({"com.example.our.app"}) 
public class MyTestConfig implements TransactionManagementConfigurer { 

Dann eine Basisklasse erstellen, die diesen Kontext und Namen es nutzt - Dies funktioniert nicht mit benannten Kontexten!:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextHierarchy({ 
    @ContextConfiguration(name="testContext", classes = MyTestConfig.class), 
}) 
public class BaseTest { 

Und schließlich einen Komponententest schreiben, die die Basisklasse erweitert und definieren einen neuen Kontext unter dem gleichen Namen mit einer Test-spezifischen Konfiguration einzelne Bohnen zu überschreiben:

@ContextHierarchy(@ContextConfiguration(name="testContext", classes = OneUnitTest.Config.class)) 
    public class OneUnitTest extends AggroBaseTest { 
     @Configuration 
     static class Config {  
      .. 
     } 
0

Sie können auch überschreiben mit einem anderen Import

<beans> 
    <import resource="classpath*:applocationContext.xml" /> 
    <bean id="dataSourceFactory" class=com.demo.MyNewClass/> 
</beans> 

Und Sie Klasse, wenn Sie

rufen Sie die Klasse, würden Sie die Instanz von neuen Klasse sehen

Weitere

<bean id="dataSourceFactory" class="org.springframework.jdbc.datasource.DriverManagerDataSource" > 
    <property name="driverClassName" value="${jdbc.driverClassName}"/> 
    <property name="url" value="${jdbc.url}"/> 
    <property name="username" value="${jdbc.username}"/> 
    <property name="password" value="${jdbc.password}"/> 
</bean> 

So gibt es verschiedene Möglichkeiten, wie Sie können das Standardverhalten

Verwandte Themen