2012-06-11 3 views
0

단위 테스트 struts2 작업 (실제 데이터베이스 사용)을 시도하고 있지만 db에 성공적으로 연결할 수 없었습니다.단위 테스트 Struts2 + DAO를 사용한 스프링 동작

저는 Spring을 처음 접했습니다. 프로젝트 설정은 여러 콩 및 DAO 클래스에서 jdbctemplate를 사용합니다.

여기 내 시도는 지금까지의 :

테스트 클래스 :

public class Test extends StrutsSpringTestCase { 

    private static final String serverURL = "jdbc:db2://xxxx.xxx.com:----/xxxx"; 
    private static final String username = "xxxxxxx"; 
    private static final String password = "xxxxxxx"; 

    @Override 
    public String[] getContextLocations() { 

    SimpleNamingContextBuilder s = new SimpleNamingContextBuilder(); 

    DB2SimpleDataSource db=new DB2SimpleDataSource(); 

    try { 
    DriverManager.registerDriver(new com.ibm.db2.jcc.DB2Driver()); 
    } catch (SQLException e2) { 
    // TODO Auto-generated catch block 
    e2.printStackTrace(); 
    } 

    try { 
    Class.forName("com.ibm.db2.jcc.DB2DataSource"); 
    } catch (ClassNotFoundException e1) { 
    // TODO Auto-generated catch block 
    e1.printStackTrace(); 
    } 

    db.setServerName(serverURL); 
    db.setPortNumber(----); 
    db.setUser(username); 
    db.setPassword(password); 

    try { 

    Hashtable env = new Hashtable(); 
    env.put(Context.INITIAL_CONTEXT_FACTORY, 
    "com.ibm.websphere.naming.WsnInitialContextFactory"); 
    env.put(Context.PROVIDER_URL, "iiop://xxxx.xxx.com:----"); 
    Context ctx = new InitialContext(env); 

    Context javaCtx = ctx.createSubcontext("jdbc"); 
    javaCtx.bind("xxx", db); 
    ctx.bind("java:", javaCtx); 

    } catch (IllegalStateException e) { 
    e.printStackTrace(); 
    } catch (NamingException e) { 
    e.printStackTrace(); 
    } 

    String[] locations = new String[1]; 

    locations[0] = "xxxx.xml"; 

    return locations; 
    } 

    public void test() throws Exception { 

    ActionProxy proxy = getActionProxy("/test"); 

    testAction rd = (testAction) proxy.getAction(); 

    System.out.println(rd.testMethod()); 

    } 
    } 

ApplicationContext.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context" 
xmlns:p="http://www.springframework.org/schema/p" 
xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans.xsd 
http://www.springframework.org/schema/aop 
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
http://www.springframework.org/schema/context 
http://www.springframework.org/schema/context/spring-context-2.5.xsd"> 

<bean name="jndi" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="jndiName" value="jdbc/XXX" /> 
</bean> 

<bean name="dataSource"  class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="com.ibm.db2.jcc.DB2Driver"/> 
<property name="url" value="jdbc:db2://----.---.com:xxxx/xxxx"/> 
<property name="username" value="xxxxxxxx"/> 
<property name="password" value="xxxxxxxx"/> 
</bean> 

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
<constructor-arg> 
    <ref bean="dataSource" /> 
</constructor-arg> 

</bean> 

<bean id="xxxxDao" 
    class="xxxx"> 
    <property name="jdbcTemplate" ref="jdbcTemplate" /> 
</bean> 

이 (다른 DAO 관련 콩에 계속). 아래와 같이

많은 클래스는 JdbcTemplate을에 의존, 그래서 그것을 포함하는 해결책을 찾기 위해 싶습니다

내 applicationContext.xml 조금있는 데이터 소스와 JNDI 빈을 포함
private JdbcTemplate jdbcTemplate; 
private String schemaName = "xxxxxx"; 
private String procedureName = "xxxxxx"; 

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { 
    this.jdbcTemplate = jdbcTemplate; 
} 

public RDResponseBO browseRD(RDRequestBO rdReqBO) { 
    SimpleJdbcCall storedProc = new SimpleJdbcCall(jdbcTemplate) 
      .withSchemaName(schemaName) 
      .withoutProcedureColumnMetaDataAccess().withProcedureName(
        procedureName); ......... 

많은. JdbcTemplate에서 둘을 결합하여 연결이 성공할 수 있는지 여부는 알 수 없습니다.

데이터 소스 만 사용하면 메타 데이터/jdbc 예외가 누락됩니다. jndiobjectfactorybean 클래스를 사용하고 싶지만 Bean은 서버를 통해 실행하지 않고 JUnit에서 초기화하지 않습니다.

jdbctemplate 빈에서 jndi bean (simpleenamingcontextbuilder를 호출 한 후)을 포함 시키려고했는데, 일치하는 생성자 예외가 발생했습니다.

아이디어/제안?

P. 질문 형식이 약간이라면 사과 드리며 stackoverflow에 익숙합니다. JNDI 콩 오류

스택 트레이스 : SimpleNamingContextBuilder를 사용하기 전에

  .springframework.beans.factory.BeanCreationException: Error creating bean with name 'jdbcTemplate' defined in class path resource [beans.xml]: Could not resolve matching constructor (hint: specify index/type/name arguments for simple parameters to avoid type ambiguities) 
      at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:250) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1003) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:907) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:485) 
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
      at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:585) 
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
      at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84) 
      at org.apache.struts2.StrutsSpringTestCase.setupBeforeInitDispatcher(StrutsSpringTestCase.java:39) 
      at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:187) 
      at junit.framework.TestCase.runBare(TestCase.java:128) 
      at junit.framework.TestResult$1.protect(TestResult.java:106) 
      at junit.framework.TestResult.runProtected(TestResult.java:124) 
      at junit.framework.TestResult.run(TestResult.java:109) 
      at junit.framework.TestCase.run(TestCase.java:120) 
      at junit.framework.TestSuite.runTest(TestSuite.java:230) 
      at junit.framework.TestSuite.run(TestSuite.java:225) 
      at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
      at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
      at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 

JNDI 오류 :

  org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'jndi' defined in class path resource [beans.xml]: Invocation of init method failed; nested exception is com.ibm.websphere.naming.CannotInstantiateObjectException: Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object. [Root exception is java.lang.NoClassDefFoundError: com.ibm.wsspi.runtime.service.WsServiceRegistry] 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1420) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:519) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
       at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:293) 
       at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) 
       at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:290) 
       at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:192) 
       at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:567) 
       at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:895) 
       at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:425) 
       at org.springframework.test.context.support.AbstractGenericContextLoader.loadContext(AbstractGenericContextLoader.java:84) 
       at org.apache.struts2.StrutsSpringTestCase.setupBeforeInitDispatcher(StrutsSpringTestCase.java:39) 
       at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:187) 
       at junit.framework.TestCase.runBare(TestCase.java:128) 
       at junit.framework.TestResult$1.protect(TestResult.java:106) 
       at junit.framework.TestResult.runProtected(TestResult.java:124) 
       at junit.framework.TestResult.run(TestResult.java:109) 
       at junit.framework.TestCase.run(TestCase.java:120) 
       at junit.framework.TestSuite.runTest(TestSuite.java:230) 
       at junit.framework.TestSuite.run(TestSuite.java:225) 
       at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 
       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
      Caused by: com.ibm.websphere.naming.CannotInstantiateObjectException: Exception occurred while the JNDI NamingManager was processing a javax.naming.Reference object. [Root exception is java.lang.NoClassDefFoundError: com.ibm.wsspi.runtime.service.WsServiceRegistry] 
       at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:1033) 
       at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookup(Helpers.java:730) 
       at com.ibm.ws.naming.jndicos.CNContextImpl.processResolveResults(CNContextImpl.java:3691) 
       at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1861) 
       at com.ibm.ws.naming.jndicos.CNContextImpl.doLookup(CNContextImpl.java:1762) 
       at com.ibm.ws.naming.jndicos.CNContextImpl.lookupExt(CNContextImpl.java:1513) 
       at com.ibm.ws.naming.jndicos.CNContextImpl.lookup(CNContextImpl.java:645) 
       at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:166) 
       at com.ibm.ws.naming.util.WsnInitCtx.lookup(WsnInitCtx.java:180) 
       at javax.naming.InitialContext.lookup(InitialContext.java:455) 
       at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:154) 
       at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:87) 
       at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:152) 
       at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:178) 
       at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:95) 
       at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105) 
       at org.springframework.jndi.JndiObjectFactoryBean.lookupWithFallback(JndiObjectFactoryBean.java:201) 
       at org.springframework.jndi.JndiObjectFactoryBean.afterPropertiesSet(JndiObjectFactoryBean.java:187) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) 
       at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417) 
       ... 25 more 
      Caused by: java.lang.NoClassDefFoundError: com.ibm.wsspi.runtime.service.WsServiceRegistry 
       at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl$2.run(WSManagedConnectionFactoryImpl.java:835) 
       at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java:118) 
       at com.ibm.ws.rsadapter.spi.WSManagedConnectionFactoryImpl.<init>(WSManagedConnectionFactoryImpl.java:840) 
       at java.lang.J9VMInternals.newInstanceImpl(Native Method) 
       at java.lang.Class.newInstance(Class.java:1325) 
       at com.ibm.ejs.j2c.ConnectionFactoryBuilderImpl.createMCF(ConnectionFactoryBuilderImpl.java:1491) 
       at com.ibm.ejs.j2c.ConnectionFactoryBuilderImpl.processObjectInstance(ConnectionFactoryBuilderImpl.java:746) 
       at com.ibm.ejs.j2c.ConnectionFactoryBuilderImpl.processObjectInstance(ConnectionFactoryBuilderImpl.java:705) 
       at com.ibm.ejs.j2c.ConnectionFactoryBuilderImpl.getObjectInstance(ConnectionFactoryBuilderImpl.java:664) 
       at javax.naming.spi.NamingManager.getObjectInstanceByFactoryInReference(NamingManager.java:485) 
       at javax.naming.spi.NamingManager.getObjectInstance(NamingManager.java:350) 
       at com.ibm.ws.naming.util.Helpers.processSerializedObjectForLookupExt(Helpers.java:927) 
       ... 44 more 
      Caused by: java.lang.ClassNotFoundException: com.ibm.wsspi.runtime.service.WsServiceRegistry 
       at java.lang.ClassNotFoundException.<init>(ClassNotFoundException.java:77) 
       at java.net.URLClassLoader.findClass(URLClassLoader.java:383) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:652) 
       at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:346) 
       at java.lang.ClassLoader.loadClass(ClassLoader.java:618) 
       ... 56 more 

  javax.naming.CommunicationException: A communication failure occurred while attempting to obtain an initial context with the provider URL: "iiop://xxxx.xxx.com:----". Make sure that any bootstrap address information in the URL is correct and that the target name server is running. A bootstrap address with no port specification defaults to port 2809. Possible causes other than an incorrect bootstrap address or unavailable name server include the network environment and workstation network configuration. [Root exception is org.omg.CORBA.COMM_FAILURE: purge_calls:1988 Reason: CONN_ABORT (1), State: ABORT (5) vmcid: IBM minor code: 306 completed: Maybe] 
       at com.ibm.ws.naming.util.WsnInitCtxFactory.mapInitialReferenceFailure(WsnInitCtxFactory.java:2269) 
       at com.ibm.ws.naming.util.WsnInitCtxFactory.getWsnNameService(WsnInitCtxFactory.java:1457) 
       at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootContextFromServer(WsnInitCtxFactory.java:987) 
       at com.ibm.ws.naming.util.WsnInitCtxFactory.getRootJndiContext(WsnInitCtxFactory.java:909) 
       at com.ibm.ws.naming.util.WsnInitCtxFactory.getInitialContextInternal(WsnInitCtxFactory.java:581) 
       at com.ibm.ws.naming.util.WsnInitCtx.getContext(WsnInitCtx.java:124) 
       at com.ibm.ws.naming.util.WsnInitCtx.getContextIfNull(WsnInitCtx.java:799) 
       at com.ibm.ws.naming.util.WsnInitCtx.createSubcontext(WsnInitCtx.java:370) 
       at com.ibm.ws.naming.util.WsnInitCtx.createSubcontext(WsnInitCtx.java:385) 
       at javax.naming.InitialContext.createSubcontext(InitialContext.java:523) 
       at junit.Test.getContextLocations(Test.java:88) 
       at org.apache.struts2.StrutsSpringTestCase.setupBeforeInitDispatcher(StrutsSpringTestCase.java:39) 
       at org.apache.struts2.StrutsTestCase.setUp(StrutsTestCase.java:187) 
       at junit.framework.TestCase.runBare(TestCase.java:132) 
       at junit.framework.TestResult$1.protect(TestResult.java:110) 
       at junit.framework.TestResult.runProtected(TestResult.java:128) 
       at junit.framework.TestResult.run(TestResult.java:113) 
       at junit.framework.TestCase.run(TestCase.java:124) 
       at junit.framework.TestSuite.runTest(TestSuite.java:232) 
       at junit.framework.TestSuite.run(TestSuite.java:227) 
       at org.junit.internal.runners.OldTestClassRunner.run(OldTestClassRunner.java:76) 
       at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:45) 
       at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 
       at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196) 
      Caused by: org.omg.CORBA.COMM_FAILURE: purge_calls:1988 Reason: CONN_ABORT (1), State: ABORT (5) vmcid: IBM minor code: 306 completed: Maybe 
       at com.ibm.rmi.iiop.Connection.purge_calls(Connection.java:1987) 
       at com.ibm.rmi.iiop.Connection.doReaderWorkOnce(Connection.java:3134) 
       at com.ibm.rmi.transport.ReaderThread.run(ReaderPoolImpl.java:138) 
+0

스택 추적을 표시 할 수 있습니까? –

+0

stacktraces 두 개를 추가했습니다 (jdbctemplate에 jndiobjectfactorybean 사용) – Dax

답변

0

교체 당신이

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 
로되어
+0

형식과 동일한 결과가 나타납니다. 테스트 클래스는 예외를 throw하지 않습니다. 프로젝트는 proxy.execute에서 "Exception"을 반환합니다. 기업 환경으로 인해 데이터 소스 연결을 성공시키기 위해 많은 속성을 설정해야한다고 생각합니다. 내가 할 수있는 경우 유용한 스택 추적을 시도 할 것입니다 – Dax

+0

어떻게 같은 오류가 표시 될 수 있습니다. 위의 오류는 생성자 인수를 가리 킵니다. 깨끗한 빌드를 시도하십시오. :) –

+0

적어도 생성자 오류가 해결되었습니다. 나는 제안을 +1 하겠지만 아직 15 명은 없다. – Dax