在利用Spring和iBatis做一个应用时,用到了数据库连接池。在Spring配置文件中,jndi配置如下
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName"><value>jdbc/mysql</value></property>
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="false"/>
<property name="resourceRef" value="true" />
<property name="proxyInterface" value="javax.sql.DataSource"/>
</bean>
但是在junit进行单元测试时,出现了问题。
org.springframework.jndi.JndiLookupFailureException: JndiObjectTargetSource failed to obtain new target object; nested exception is javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
Caused by: javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial
at javax.naming.spi.NamingManager.getInitialContext(Unknown Source)
at javax.naming.InitialContext.getDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.getURLOrDefaultInitCtx(Unknown Source)
at javax.naming.InitialContext.lookup(Unknown Source)
at org.springframework.jndi.JndiTemplate$1.doInContext(JndiTemplate.java:123)
at org.springframework.jndi.JndiTemplate.execute(JndiTemplate.java:85)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:121)
at org.springframework.jndi.JndiTemplate.lookup(JndiTemplate.java:146)
at org.springframework.jndi.JndiLocatorSupport.lookup(JndiLocatorSupport.java:93)
at org.springframework.jndi.JndiObjectLocator.lookup(JndiObjectLocator.java:105)
at org.springframework.jndi.JndiObjectTargetSource.getTarget(JndiObjectTargetSource.java:126)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:184)
at $Proxy0.getConnection(Unknown Source)
at org.springframework.jdbc.datasource.DataSourceTransactionManager.doBegin(DataSourceTransactionManager.java:200)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:350)
at org.springframework.test.AbstractTransactionalSpringContextTests.startNewTransaction(AbstractTransactionalSpringContextTests.java:387)
at org.springframework.test.AbstractTransactionalSpringContextTests.onSetUp(AbstractTransactionalSpringContextTests.java:217)
at org.springframework.test.AbstractSingleSpringContextTests.setUp(AbstractSingleSpringContextTests.java:103)
at junit.framework.TestCase.runBare(TestCase.java:128)
at org.springframework.test.ConditionalTestCase.runBare(ConditionalTestCase.java:76)
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)
在junit环境下连接数据源失败,为什么呢,因为jndi是在tomcat下配置的,但是用junit进行单元测试的环境下是独立于tomcat的,不能够与jndi中的数据相连。这种问题有两种解决办法。
一是在进行单元测试时,利用jdbc连接数据库。将Spring配置文件中的dataSource部分改成下面的方式:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>com.mysql.jdbc.Driver</value>
</property>
<property name="url">
<value>jdbc:mysql://localhost:3306/cms</value>
</property>
<property name="username">
<value>root</value>
</property>
<property name="password">
<value>admin</value>
</property>
</bean>
二是利用Spring针对单元测试而扩展的功能:
具体参考如连接:http://203.208.37.132/search?q=cache:4TQHNXE6aTQJ:jim19770812.blogspot.com/2009/07/springjndi.html+单元测试+t连接+jndi失败&cd=1&hl=zh-CN&ct=clnk&gl=cn&st_usg=ALhdy2-zZ_vezSRBqGuC621gPYNmE3L2IA
个人认为第一种方法比较方便,只需要在进行单元测试时利用jdbc的方式,在控制层测试时,可以将其再转换到jndi的方式上去。第二种方法通过扩展Spring的功能,相当于在java代码中重新创建了一个dataSource,而不是通过配置文件。
相关推荐
10. **测试与调试**:通过单元测试和整合测试验证整个系统的功能。 通过这个实例,初学者可以了解到Web应用程序的开发流程,掌握MVC架构,理解框架间的协作方式,以及如何利用现代Java技术栈来构建实际的Web应用。...
6. **测试与优化**:编写单元测试和集成测试,确保各个组件正常工作。根据需求优化性能,如缓存策略、错误处理等。 这样的整合实例对于初学者来说,是一个很好的实践平台,能够帮助他们深入理解这些技术的协同工作...
这种架构的优点在于各层职责分明,降低了耦合度,同时借助 Spring 的强大功能,可以方便地进行事务管理和单元测试。 在实际项目中,使用这个压缩包可以快速搭建一个基本的开发环境,开发者只需按照这三个框架的规范...
在tests2si目录下,可能包含的是测试相关的文件,这些文件可能包括单元测试、集成测试,用于验证Struts2、Spring、iBatis以及jQuery的整合是否正常工作。测试文件通常会模拟用户操作,调用后端接口,检查返回的数据...
【标签】"liferay struts2 spring ibatis"这些标签突出了项目的开发框架和技术栈,方便其他开发者快速识别项目的核心技术和潜在问题,从而进行协作或者参考。 【SSI-portlet】这个压缩包中的"SSI-portlet"可能是...
8. **测试**:通过单元测试和集成测试确保每个组件的正确运行,最后进行系统测试,确保整个应用的功能完整性和性能稳定性。 以上是SSH整合的基本流程和主要知识点。这个项目提供了一个实际的示例,有助于开发者深入...
在开发过程中,我们还应该利用Spring的单元测试和集成测试框架,如JUnit和Spring Test,对线程安全的实现进行充分的测试。通过模拟多线程环境,检查是否存在并发问题,确保代码在真实场景下的正确性。 最后,关于...
在 `test` 目录下,你会发现单元测试代码,这些代码通常使用 JUnit 测试框架,对 Service 层或 DAO 层的功能进行验证。 集成步骤大致如下: 1. 在 `pom.xml` 或 `build.gradle` 文件中添加 Spring 和 iBATIS 的依赖...
9. **测试和部署**:完成所有配置和编码后,我们可以通过单元测试和集成测试确保功能的正确性,然后将应用打包成WAR文件,部署到Tomcat服务器上。 通过以上步骤,我们就成功地使用注解方式搭建了一个Spring MVC、...
7. **测试**:编写单元测试和集成测试,确保各组件功能正常。 本项目是一个典型的Java Web应用示例,展示了如何将多种技术融合,构建一个高效、可维护的轻量级架构。通过学习和实践,开发者可以深入理解这些技术的...
通常会包含JUnit测试用例,对Action进行单元测试。 9. **运行与调试**:部署项目到Tomcat服务器,通过浏览器访问URL,测试CRUD功能是否正常工作。 集成Struts2、Spring和iBatis可以提高代码的可读性和可维护性,...
在集成环境中,Junit用于对各个组件,尤其是业务逻辑和数据访问层进行单元测试,确保在修改代码后,原有的功能仍然正确无误。 总的来说,这个项目展示了如何使用SSI框架进行Web开发,包括基本的CRUD操作和存储过程...
7. **单元测试**:使用JUnit进行业务逻辑和数据访问的单元测试,确保代码的正确性。 8. **部署与运行**:了解如何将项目打包成WAR文件,部署到Tomcat或其他Servlet容器中,以及如何通过Eclipse的Debug模式进行远程...
在本篇“Spring3学习笔记(2)-集成ibatis3进行单元测试”中,我们将深入探讨如何在Spring3框架中整合Ibatis3,并利用它来进行单元测试。这个主题对于理解如何在实际项目中实现数据访问层的测试具有重要意义。在现代...
标题 "spring2.5+ibatis3+web service cxf 例子MyEclipse工程" 提供了一个关于如何在MyEclipse环境中集成并使用Spring 2.5、iBatis 3和CXF Web服务的实例。这个项目组合是Java企业级开发中常见的技术栈,下面将详细...
5. **单元测试**:编写测试用例,确保各部分功能正常运行。 6. **部署与调试**:将项目部署到服务器上,进行系统级别的调试和优化。 通过上述步骤,可以成功地利用 Spring 2.5.5、Struts 2 和 iBatis 2.3.4 构建出...
9. **测试**:运行应用并进行单元测试、集成测试以确保所有组件协同工作。 通过这种方式,开发者可以构建出一个完整的、功能丰富的Java Web应用程序,充分利用各组件的优势,实现高效的开发和维护。
SSI框架,即Spring、Struts和iBatis的集成框架,是Web开发中常见的技术栈,用于构建高效、可维护的MVC架构应用。在这个项目中,使用的是Spring 2.5、Struts 2.1和iBatis 2.3版本,这些组件在2000年代末到2010年代初...