2

我想测试一个数据库视图,我使用 db-unit 将数据插入到测试视图使用的表中,而预期值表单视图是由 db-unit 完成的,但是这个视图使用了另一个我想模拟的视图中的一些数据,我做了一些用模拟数据替换视图的脚本,在完成测试方法后,模拟视图被替换为原始视图

但是我发现一个问题,@ExpectedDatabase是在方法之后调用@After void after(),并且测试失败。

如何@After void after()先从 junit 执行,然后再@ExpectedDatabase从 db-unit 执行?

这是我的代码:

@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 ));
  }
}
4

1 回答 1

1

您的声明@TestExecutionListeners已损坏:它不会“按原样”编译。

确保您注册了和TransactionalTestExecutionListener viaDbUnitTestExecutionListener@TestExecutionListeners并使用 Spring 的@Transactional注解来注解您的测试类,类似于以下内容...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = ApplicationConfigTest.class)
@TestExecutionListeners({ DependencyInjectionTestExecutionListener.class,
    DirtiesContextTestExecutionListener.class,
    TransactionalTestExecutionListener.class,
    DbUnitTestExecutionListener.class })
@Transactional
public class ClassTest { /* ... */ }
于 2017-07-18T11:40:17.833 回答