2013-11-26 3 views
5

Betrachten Sie die typische DBUnit Frühlings-Test (siehe https://github.com/springtestdbunit/spring-test-dbunit):Wie wird DBUnit @DatabaseSetup vor dem Autowire-Vorgang im Frühjahr ausgeführt?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(locations = { 
"classpath:/META-INF/spring/applicationContext-database.xml", 
"classpath:spring-*.xml" 
}) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class }) 
@DatabaseSetup("/dbunit/data.xml") 
public class UnitTest { 

    @Autowired 
    private UnitUnderTest uut; 

    @Test 
    public void shouldInitDB() { 
     ... 
    } 
} 

Was ich überprüft haben, ist das, und hat erwartet, autowiring vor DatabaseSetup passieren wird. Dies muss geschehen, weil DBUnit vom Anwendungskontext abhängig ist, um die konfigurierte Datenquelle bereitzustellen.

Das Problem ist, dass die UnitUnderTest-Bean eine @PostConstruct hat, wo es einige Daten aus der DB lädt, aber da die Autowiring vor dem DBunit-Setup passiert, sind die Daten zu diesem Zeitpunkt nicht verfügbar.

Haben Sie Ideen, wie Sie dieses Problem sauber lösen können?

+1

gleiche Problem hier nutzen können. Irgendwelche Lösungen? – Puce

+0

Es ist wirklich keine gute Lösung, aber erlaubt mir, vorwärts zu bewegen.Erstellen Sie eine TestClass, die von dem Objekt, das autowired werden soll, erben und eine Methode für die externe Initialisierung offen legen. Verwenden Sie im @Before-Test. –

+0

Keine Lösung bisher. Nicht einmal eine angemessene Workaround. Wird weiter suchen. –

Antwort

0

Sie können eine Setup-Methode in Ihrer Testklasse verwenden und die Methode post construct manuell aufrufen. Das wird funktionieren.

+0

Ich fürchte, das ist eine Nicht-Lösung! In diesem Fall müsste ich die Verantwortung übernehmen, diese Methode zu einer anderen Bean aufzurufen. Ich glaube nicht, dass das nötig ist. Ich hüpfe diesen Frühlingstest - dbunit wird eine sauberere, weniger aufdringliche Art haben, diese Art von Szenario zu testen, was sicher nicht so selten sein wird. –

+0

Meine postconstruct-Methode versucht, Datenbankobjekt abzurufen, und es bricht beim Autowiren ab, so dass diese Lösung nicht hilft. – TheBakker

1

Sie können Spring ResourceDatabasePopulator.

Ich glaube, Sie so etwas wie dieses

@PostConstruct 
public void myInMemryPopulator() { 
final ResourceDatabasePopulator databasePopulator = new ResourceDatabasePopulator(); 

     try { 

      Resource[] array = resourceResolver.getResources("classpath:/*.sql");  

      for (Resource resource : array) { 

       databasePopulator.addScript(resource); 
      } 
      databasePopulator.populate(dataSource.getConnection()); 

     } catch (IOException | SQLException e) { 
      LOGGER.error("Error in databasePopulator {} ", e); 
     } 

    } 
+0

wenn das immer noch nicht hilft. Sie können einen übergeordneten Testfall erstellen und statischen Block im übergeordneten Testfall hinzufügen, um diese Methode aufzurufen – Niraj

Verwandte Themen