【发布时间】:2009-11-10 02:35:33
【问题描述】:
我问了一个question,其标题可能具有误导性,所以我将尝试用更详细的内容再次提出这个问题。 (我知道问题似乎很长,但请多多包涵)
我想做的事:我只是想为我的 DAO 编写一个测试用例并让它工作。我知道我的 DAO 在容器(应用程序服务器)内工作正常,但是从测试用例调用 DAO 时......它不起作用。我想是因为它在容器之外。
spring-for-iBatis.xml 中的内容
<bean id="IbatisDataSourceOracle" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jdbc/RSRC/my/db/oltp"/>
</bean>
<bean id="MapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
<property name="dataSource" ref="IbatisDataSourceOracle"/>
</bean>
我的 sql-map-config-oracle.xml 中的东西
<sqlMapConfig>
<settings enhancementEnabled="true" useStatementNamespaces="true" />
<transactionManager type="JDBC">
<dataSource type="JNDI">
<property name="DataSource" value="jdbc/RSRC/my/db/oltp"/>
</dataSource>
</transactionManager>
<sqlMap resource="mymapping.xml"/>
</sqlMapConfig>
我的抽象类:
public abstract MyAbstract {
public SqlMapClientTemplate getSqlTempl() SQLException{
public static final String ORCL = "jdbc/RSRC/PIH/eiv/oltp";
try {
ApplicationInitializer.getApplicationContext().getBean("MapClient");
SqlMapClient scl = (SqlMapClient) ApplicationInitializer.getApplicationContext().getBean("MapClient");
DataSource dsc = (DataSource) MyServiceLocator.getInstance().getDataSource(ORCL);
return new SqlMapClientTemplate (dsc, scl);
}
catch (NamingException e)
{
log.error(ne.getMessage(), e);
throw new SQLException("some error here: " + e.getMessage());
}
}
}
我的 DAO:
public class MyDAO extends MyAbstract{
public AnObject getSomething(String id)
{
HashMap myMap = new HashMap();
myMap.put("id", id);
try {
setSqlMapClientTemplate(getSqlTempl());
}
catch (SQLException ne)
{
log.error (ne.getMessage(), ne);
}
getSqlMapClientTemplate().queryForList("mymapping.someproc", myMap);
return AnObject ((List)myMap.get("firstresult").get(0));
}
}
我的测试
public class MyDAOTests extends TestCase {
public void testMyDAO ()
{
MyDAO myd = new MyDAO();
AnObject ano = myd.getSomething("15");
assertEquals("1500", ano.getContentId());
}
}
我试图在这段代码 sn-p 中呈现整个问题。测试失败,因为它无法连接到数据库……因为它在容器之外。我知道可以修复设计以更好地利用依赖注入。您能否根据这个 sn-p 向我展示可以进行哪些改进以使测试能够正常工作?
我一直在努力解决这个问题,非常感谢一些帮助。
PS:我不得不使用setSqlMapClientTemplate(),因为我希望调用我的DAO 很简单MyDAO myd = new MyDAO() 我不想为我的每个DAO 制作接口。
【问题讨论】:
-
为什么你的 Abstract 类有硬连线的 JNDI 名称?只需使用 Spring 注入即可。
-
这看起来像是一个实际上并不了解 Spring 的人为 Spring 编写的应用程序。我为你感到难过。
-
我为自己感到难过……因为对 spring 的了解不够好,无法自己更正这段代码。错在我...
标签: java spring junit dao ibatis