由于JNDI查找,无法在Grails集成测试中初始化Service

时间:2013-01-09 17:38:07

标签: grails service groovy jndi integration-testing

我有一个实现InitializingBean和DisposableBean

的服务
class MyService implements InitializingBean, DisposableBean {

    static transactional = false

    def grailsApplication

    @Override
    void afterPropertiesSet() {
        System.setProperty("JMS_TIMEOUT", grailsApplication.config.JMS_TIMEOUT);
        // code performing a JDNI lookup
    }
}
enter code here

系统属性用于初始化服务中的某些其他组件。我在Config.groovy中添加了配置。

grails.config.locations = [ "file:${basedir}/grails-app/conf/myconfig.properties" ]

这在运行应用程序时工作正常。但是,我在测试/集成中编写了一个注入服务的集成测试。

class MyServiceIntegrationTests  extends GrailsUnitTestCase {

   def myService

   void testMyService() {

   }
}

运行测试时,我得到一个StackTrace,其根本原因如下:

Caused by: javax.naming.NameNotFoundException: Name [ConnectionFactory] not bound; 0 bindings: []
at javax.naming.InitialContext.lookup(InitialContext.java:354)
at com.ubs.ecredit.common.jmsclient.DefaultConnector.<init>(DefaultConnector.java:36)

似乎无法加载Config或在集成测试中有所不同。知道如何更改配置或代码,以便在实例化服务之前为集成测试设置这些属性吗?

更新 事实证明原因不是配置,而是JDSI查找和Grails中的错误。 请参阅:http://jira.grails.org/browse/GRAILS-5726

2 个答案:

答案 0 :(得分:1)

${basedir}在不同的环境中获得不同的路径。作为替代方案,您可以使用PropertiesLoaderUtils.loadProperties加载自定义配置:

import org.springframework.core.io.support.PropertiesLoaderUtils
import org.springframework.core.io.ClassPathResource
....
void afterPropertiesSet() {
    def configProperties = PropertiesLoaderUtils.loadProperties(
                   new ClassPathResource("myconfig.properties"))
    System.setProperty("JMS_TIMEOUT", configProperties.getProperty("JMS_TIMEOUT"))
    ....
}

答案 1 :(得分:0)

事实证明原因是库方法使用的JNDI查找,我没有在我的服务中的afterPropertiesSet()中显示,可以在StackTrace中看到。

在做了一些研究后,我发现这是Grails中的一个错误:http://jira.grails.org/browse/GRAILS-5726

添加上述解决方法,暂时解决了这个问题。