Gui*_* He 3 testing spring cucumber
我需要在实践中将黄瓜与弹簧结合起来。但是我不能用spring的@Sql注释导入一些测试数据。然而,其他不使用黄瓜的集成测试工作正常。我没找到为什么?黄瓜赛跑者:
@RunWith(Cucumber.class)
@CucumberOptions(features={"classpath:features/"})
public class CucumberIT {
}
Run Code Online (Sandbox Code Playgroud)
和步骤定义:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes={DevDbConfig.class})
@Sql("classpath:test-reader-data.sql")
@Transactional
@ActiveProfiles("dev")
public class StepDefines {
@Autowired
ReaderService readerService;
Reader reader;
@Given("^a user with name Lily$")
public void a_user_with_name_Lily() throws Throwable {
reader = readerService.findByName("Lily"); // reader is null here!
}
@Given("^this user Lily exists$")
public void this_user_Lily_exists() throws Throwable {
assertThat(reader, notNullValue());
}
@Then("^Lily's info should be returned$")
public void lily_s_info_should_be_returned() throws Throwable {
assertThat(reader.getName(), is("Lily"));
}
}
Run Code Online (Sandbox Code Playgroud)
但是下面的测试代码可以正常导入测试数据:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes={DevDbConfig.class})
@Sql("classpath:test-reader-data.sql")
@Transactional
@ActiveProfiles("dev")
public class ReaderServiceTest {
@Autowired
ReaderService readerService;
@Autowired
EntityManager entityManager;
@Test
public void testQueryByIdAndShouldNotReturnNull() {
Reader reader = readerService.findByName("Lily");
assertThat(reader, notNullValue()); // reader is not null!
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢!
该@Sql会执行SqlScriptsTestExecutionListener。SpringSpringJUnit4ClassRunner将注册所有的TestExecutionListeners。
从SqlScriptsTestExecutionListenerjava doc,它说:
脚本和内联语句将在执行相应的测试方法之前或之后执行,具体取决于 executionPhase 标志的配置值。
所以一个类级别@Sql相当于所有@Test带有单独@Sql注解的方法。
但是,当cucumber运行时,它不会执行任何@Test方法,@Sql也没有机会被执行。
最后,我必须自己做:
@Autowired
DataSource ds;
@Given("^a user with name Lily$")
public void a_user_with_name_Lily() throws Throwable {
ScriptUtils.executeSqlScript(ds.getConnection(), new ClassPathResource("test-reader-data.sql"));
reader = readerService.findByName("Lily");
}
@Given("^this user Lily exists$")
public void this_user_Lily_exists() throws Throwable {
assertThat(reader, notNullValue());
}
@Then("^Lily's info should be returned$")
public void lily_s_info_should_be_returned() throws Throwable {
assertThat(reader.getName(), is("Lily"));
}
Run Code Online (Sandbox Code Playgroud)