【问题标题】:spring test not populating database configuration from application.propertiesspring test 没有从 application.properties 填充数据库配置
【发布时间】:2017-03-17 13:39:08
【问题描述】:

在我的 Spring Boot 应用程序中,我有以下调用存储过程的类

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;
    }
}

现在我想使用 Integration Testing a Spring Boot Application 中的以下示例对此类进行集成测试。

@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 是主应用程序类的名称,它是api 的入口点。根据该网页,“@SpringApplicationConfiguration 注释将触发读取 Spring Boot 特定配置、属性等的逻辑。”我的理解是这也会在我的 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。我究竟如何加载运行测试的数据库连接配置?我正在使用 Spring Boot 1.3

编辑 由于 application.properties 位于 src/main/resources 中,而我的测试类位于 src/test/java 中,我想我会根据对Spring jUnit Testing properties file 的回答在src/test/resources 下有另一个属性文件。所以我这样做并在我的测试类中添加了注释@PropertySource("classpath:application-test.properties"),但仍然得到同样的错误。有没有办法知道是否正在读取属性文件和/或当前的类路径是什么?

【问题讨论】:

    标签: jdbc spring-boot spring-test


    【解决方案1】:

    @PropertySource 用于@Configuration 类,而不是测试类。

    在您的测试课上,您应该改用@TestPropertySource

    【讨论】:

      【解决方案2】:

      修改你的测试类如下:

      @SpringApplicationConfiguration(classes = RistoreWebApplication.class, initializers = ConfigFileApplicationContextInitializer.class)
      

      请参考以下内容:

      Spring boot, read yml properties via integration test case

      http://docs.spring.io/spring-boot/docs.old/current/api/org/springframework/boot/context/initializer/ConfigFileApplicationContextInitializer.html

      编辑:关于以下评论。

      通过您的存储库访问您的数据存储。

      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"));
      

      【讨论】:

      • 我添加了initializers,但仍然无法使用。试图通过System.getProperty 打印出一些属性,它是空的。现在我开始怀疑SpringApplicationConfiguration 的类是否正确。我应该使用作为整个项目入口点的主应用程序类还是其他东西?
      • 我现在可以在测试类中获取属性。但是,当我在执行insertFmTrfs 方法时仍然收到The application must supply JDBC connections 错误。准确地说,错误是在session.doWork 行引发的。虽然这个方法没有拾取属性?
      • 没错,您不应该创建连接。数据库连接对象将在运行时由 Springboot 提供,这就是全部目的。
      猜你喜欢
      • 2014-11-04
      • 2016-09-29
      • 2016-09-14
      • 2017-07-11
      • 2014-10-11
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2018-03-30
      相关资源
      最近更新 更多