spring 测试不从 application.properties 填充数据库配置
spring test not populating database configuration from application.properties
在我的 spring 引导应用程序中,我有以下 class 调用存储过程
public class FmTrfUtil {
static int returnVal;
public static int insertFmTrfs(List<String> trfs, String source) {
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
Session session = em.unwrap( Session.class );
final String[] trfArray = trfs.toArray(new String[trfs.size()]);
final String src = source;
session.doWork( new Work(){
public void execute(Connection conn) throws SQLException {
CallableStatement stmt = null;
OracleConnection oraCon = conn.unwrap(OracleConnection.class);
Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setArray(2, array);
stmt.setString(3, src);
stmt.execute();
returnVal = stmt.getInt(1);
}
});
return returnVal;
}
}
现在我想 运行 使用 spring 测试 Integration Testing a Spring Boot Application 中的以下示例对此 class 进行集成测试。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RistoreWebApplication.class)
@WebAppConfiguration
public class FmTrfUtilTest {
static EntityManagerFactory factory = null;
static EntityManager manager = null;
@Test
public void test() {
List<String> trfs = new ArrayList<String>();
trfs.add("TRF000001");
trfs.add("TRF000002");
int ret = FmTrfUtil.insertFmTrfs(trfs, "SARC");
assertTrue(ret > 0);
}
}
这里 RistoreWebApplication
是主应用 class 的名称,它是 api 的入口点。根据该网页,"The @SpringApplicationConfiguration
annotation will trigger logic for reading Spring Boot specific configurations, properties, and so on." 我的理解是这也会在我的 application.properties 中加载数据库连接信息:
spring.datasource.url=jdbc:oracle:thin:@ldap://xxx:389/risdev3, cn=OracleContext,dc=yyy,dc=com
spring.datasource.username=rowner
spring.datasource.password=rowner987
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
但是,当我运行这个测试的时候,我得到了UnsupportedOperationException: The application must supply JDBC connections
。我究竟如何加载数据库连接配置 运行ning 测试?我正在使用 spring boot 1.3
编辑
因为 application.properties 住在 src/main/resources 而我的测试 classes 在 src/test/java,我想我会在 src/test/resources
下有另一个 属性 文件关于 Spring jUnit Testing properties file 的答案。所以我这样做并在我的测试 class 中添加了注释 @PropertySource("classpath:application-test.properties")
,但仍然出现相同的错误。有没有办法知道是否正在读取 属性 文件 and/or 当前 class 路径是什么?
修改您的测试 class 如下所示:
@SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
请参考以下:
Spring boot, read yml properties via integration test case
编辑:关于以下评论。
通过您的存储库访问您的数据存储。
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html
@Autowired
YourRepository repository;
repository.save(Arrays.asList("value_1", "value_2", "value_3"));
@PropertySource
用于 @Configuration
class,而不是测试 class.
在您的测试 class 中,您应该改为使用 @TestPropertySource
。
在我的 spring 引导应用程序中,我有以下 class 调用存储过程
public class FmTrfUtil {
static int returnVal;
public static int insertFmTrfs(List<String> trfs, String source) {
EntityManager em = Persistence.createEntityManagerFactory("RIStore_FM").createEntityManager();
Session session = em.unwrap( Session.class );
final String[] trfArray = trfs.toArray(new String[trfs.size()]);
final String src = source;
session.doWork( new Work(){
public void execute(Connection conn) throws SQLException {
CallableStatement stmt = null;
OracleConnection oraCon = conn.unwrap(OracleConnection.class);
Array array = oraCon.createARRAY("VARCHAR2_TAB_T", trfArray);
stmt = conn.prepareCall("{? = call FM_TRF_UTIL.process_fm_trf(?,?)}");
stmt.registerOutParameter(1, Types.INTEGER);
stmt.setArray(2, array);
stmt.setString(3, src);
stmt.execute();
returnVal = stmt.getInt(1);
}
});
return returnVal;
}
}
现在我想 运行 使用 spring 测试 Integration Testing a Spring Boot Application 中的以下示例对此 class 进行集成测试。
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = RistoreWebApplication.class)
@WebAppConfiguration
public class FmTrfUtilTest {
static EntityManagerFactory factory = null;
static EntityManager manager = null;
@Test
public void test() {
List<String> trfs = new ArrayList<String>();
trfs.add("TRF000001");
trfs.add("TRF000002");
int ret = FmTrfUtil.insertFmTrfs(trfs, "SARC");
assertTrue(ret > 0);
}
}
这里 RistoreWebApplication
是主应用 class 的名称,它是 api 的入口点。根据该网页,"The @SpringApplicationConfiguration
annotation will trigger logic for reading Spring Boot specific configurations, properties, and so on." 我的理解是这也会在我的 application.properties 中加载数据库连接信息:
spring.datasource.url=jdbc:oracle:thin:@ldap://xxx:389/risdev3, cn=OracleContext,dc=yyy,dc=com
spring.datasource.username=rowner
spring.datasource.password=rowner987
spring.datasource.driverClassName=oracle.jdbc.OracleDriver
但是,当我运行这个测试的时候,我得到了UnsupportedOperationException: The application must supply JDBC connections
。我究竟如何加载数据库连接配置 运行ning 测试?我正在使用 spring boot 1.3
编辑
因为 application.properties 住在 src/main/resources 而我的测试 classes 在 src/test/java,我想我会在 src/test/resources
下有另一个 属性 文件关于 Spring jUnit Testing properties file 的答案。所以我这样做并在我的测试 class 中添加了注释 @PropertySource("classpath:application-test.properties")
,但仍然出现相同的错误。有没有办法知道是否正在读取 属性 文件 and/or 当前 class 路径是什么?
修改您的测试 class 如下所示:
@SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
请参考以下:
Spring boot, read yml properties via integration test case
编辑:关于以下评论。
通过您的存储库访问您的数据存储。
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/integration-testing.html
@Autowired
YourRepository repository;
repository.save(Arrays.asList("value_1", "value_2", "value_3"));
@PropertySource
用于 @Configuration
class,而不是测试 class.
在您的测试 class 中,您应该改为使用 @TestPropertySource
。