在使用Spring 5、Junit4.11 和 JDK8运行一些集成测试之前,我正在尝试使用 @SqlGroup 执行一些 SQL 语句。
直到今天,当我在我的“ConfigurationComponent”bean 上添加了一些初始配置时,一切都工作得完美无缺,并带有注释 @PostConstruct。
当@PostConstruct 方法调用依赖于数据库的bean 时,测试失败,因为hiberante(因此是数据库)找不到预加载的模式。
正如我调查的那样,我发现放在@SqlGroup 中的语句将在ApplicationContext 初始化之后执行,因此@PostConstruct 在模式加载之前执行。
这是我的集成测试抽象类。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:application-context-test.xml" })
@Transactional
@Rollback(true)
@SqlGroup({
@Sql(executionPhase = ExecutionPhase.BEFORE_TEST_METHOD, scripts = {
"classpath:db_config.sql",
"classpath:consultas/setup_esquema_0.1.sql",
"classpath:db_datos_iniciales.sql"}),
@Sql(executionPhase = ExecutionPhase.AFTER_TEST_METHOD, scripts = "classpath:db_teardown.sql") })
public abstract class AbstractServiceTest {
@BeforeClass
public static void setUpBeforeClass() throws Exception {
}
@AfterClass
public static void tearDownAfterClass() throws Exception {
}
@Before
public abstract void setUp() throws Exception;
@After
public abstract void tearDown() throws Exception;
public static Long randomId() {
return new Long(Math.round(Math.random() * 1000));
}
}
冒犯的豆子
@Configuration
public class ConfigurationComponent {
@Autowired
Resources resources; // resources are retrieved from database.
@PostConstruct
public void startUp() throws VariableGlobalInexistenteException {
Config.environment = resources
.getWsaaEnv();
Config.validation = resources
.getWsaaEnvValidation();
}
}
我找不到使用@SqlGroup 解决此问题的方法。是否有任何解决方案,一种改变生命周期并首先执行 sql 语句的方法?如您所见,我正在使用ExecutionPhase.BEFORE_TEST_METHOD,这种情况没有明确的配置,例如“ExecutionPhase.BEFORE_SETUP”。
2018 年 9 月 7 日更新 - 看起来没有办法使用 @Sql 实现这一点:
@Sql 和 @PostConstruct 的调用都由 Spring Framework 而非 Spring Boot 处理。另外,我相信这是按设计工作的。@Sql 的默认执行阶段是 BEFORE_TEST_METHOD(另一个选项是 AFTER_TEST_METHOD)。应用程序上下文被刷新,因此 @PostConstruct 被调用,一次用于整个测试类(事实上,如果它们共享相同的配置,它可能为多个测试类调用一次),这发生在调用各个测试方法之前。换句话说,您不能使用@Sql 作为为@PostConstruct 中的调用准备数据库的方法。