2017-07-10 4 views
1

Je veux tester une vue de base de données et j'utilise db-unit pour insérer des données dans des tables qui sont utilisées par vue testée et les valeurs attendues sont vues par db-unit, mais cette vue utilise certaines données d'une autre vue que je veux à la maquette, je l'ai fait un peu un script qui remplacent vue avec les données simulées, après avoir terminé la méthode d'essai vue maquette est remplacé avec vue originaleComment puis-je d'abord exécuter @After void after() à partir de junit et ensuite @ExpectedDatabase à partir de db-unit?

mais je trouve un problème, @ExpectedDatabase est invoqué après @After void after() méthode et test échoue.

Comment puis-je exécuter d'abord @After void after() à partir de junit, puis @ExpectedDatabase à partir de db-unit?

Voici mon 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

Qu'advient-il si vous remplacez '@Before 'et' @ After' avec '@ BeforeTransaction' et' @ AfterTransaction', respectivement? –

+0

@SamBrannen J'ai essayé, mais le test échoue toujours. Je pense que l'unité db a sa propre transaction qui commence avant la transaction de printemps –

+0

Comment configurez-vous le support de DbUnit? Du code que vous avez posté, il semble impossible que DbUnit s'exécute même. –

Répondre

0

Votre déclaration pour @TestExecutionListeners est rompu: il ne compile pas "comme est".

Assurez-vous que vous enregistrez le TransactionalTestExecutionListeneret la DbUnitTestExecutionListener via @TestExecutionListeners et annoter votre classe de test avec l'annotation de printemps @Transactional, quelque chose de similaire à ce qui suit ...

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