2017-07-10 3 views
1

Ich möchte eine Datenbankansicht testen und ich verwende db-unit, um Daten in Tabellen einzufügen, die von getesteten Ansicht verwendet werden und erwartete Werte Formularansicht von db-Einheit durchgeführt wird, aber diese Ansicht verwenden einige Daten aus einer anderen Ansicht, die ich möchte zu verspotten, habe ich ein Skript getan, die Ansicht mit Scheindaten zu ersetzen, nach Abschluss der Testmethode Scheinansicht mit Originalansicht ersetzt wirdWie kann ich zuerst @After void nach() von junit und dann @ExpectedDatabase von db-unit ausführen?

Aber ich finde ein Problem, @ExpectedDatabase wird nach @After void after() Methode aufgerufen, und der Test schlägt fehl.

Wie kann ich zuerst von junit und dann @ExpectedDatabase von db-unit ausführen?

Hier ist mein Code:

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = ApplicationConfigTest.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener. DirtiesContextTestExecutionListener.class }) 
public class ClassTest { 

private static final String MOCK_REOURCE_PATH = "classpath:sql/mock_view.sql"; 

private static final String ORIGINAL_REOURCE_PATH = "classpath:sql/original_view.sql"; 

@Autowired 
private ApplicationContext applicationContext; 

@Before 
public void init() { 
    ScriptUtils.executeSqlScript((DataSource) applicationContext.getBean("dataSource").getConnection(), applicationContext.getReource(MOCK_REOURCE_PATH)); 
} 

    @Test 
    @DatabaseSetup("classpath:sample-data.xml") 
    @ExpectedDatabase(assertionMode = NON_STRICT, value = "classpath:expected-data.xml") 
    public void testView() { 
    } 

    @After 
    public void after() { 
    ScriptUtils.executeSqlScript((DataSource) applicationContext.getBean("dataSource").getConnection(), applicationContext.getReource(ORIGINAL_REOURCE_PATH)); 
    } 
} 
+0

Was passiert, wenn Sie '@Before ersetzen geschieht 'und' @ After' mit '@ BeforeTransaction' bzw.' @ AfterTransaction'? –

+0

@SamBrannen Ich habe es versucht, aber der Test schlägt immer noch fehl. Ich denke, die DB-Einheit hat eine eigene Transaktion, die vor der Frühjahrstransaktion beginnt. –

+0

Wie konfigurieren Sie die DbUnit-Unterstützung? Aus dem Code, den Sie gepostet haben, scheint es unmöglich zu sein, dass DbUnit überhaupt ausgeführt wird. –

Antwort

0

Ihre Erklärung für @TestExecutionListeners gebrochen wird: es nicht kompilieren "wie es ist".

Stellen Sie sicher, dass die TransactionalTestExecutionListenerund die DbUnitTestExecutionListener über @TestExecutionListeners registrieren und Ihre Testklasse mit Frühling mit Anmerkungen versehen @Transactional Anmerkung, etwas ähnlich der folgenden ...

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = ApplicationConfigTest.class) 
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class, 
    DirtiesContextTestExecutionListener.class, 
    TransactionalTestExecutionListener.class, 
    DbUnitTestExecutionListener.class }) 
@Transactional 
public class ClassTest { /* ... */ } 
Verwandte Themen