Dra*_*ake 1 java junit spring dao ibatis
我问了一个问题,其标题可能会产生误导,所以我将尝试用更详细的东西再次提出这个问题.(我知道问题似乎很长但请耐心等待我)
我正在尝试做什么:我只是想为我的DAO编写测试用例并使其工作.我知道我的DAO在容器(app服务器)内工作正常但是从测试用例调用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>
Run Code Online (Sandbox Code Playgroud)
在我的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>
Run Code Online (Sandbox Code Playgroud)
我的抽象类:
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());
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的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));
}
}
Run Code Online (Sandbox Code Playgroud)
Mytests
public class MyDAOTests extends TestCase {
public void testMyDAO ()
{
MyDAO myd = new MyDAO();
AnObject ano = myd.getSomething("15");
assertEquals("1500", ano.getContentId());
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在这段代码中提出整个问题.测试失败,因为它无法连接到数据库...因为它在容器外部.我知道可以修复设计以更好地利用依赖注入.基于这个片段,您能告诉我,可以进行哪些改进以使测试有效吗?
我一直在努力解决这个问题,真的很感激一些帮助.
PS:我必须使用,setSqlMapClientTemplate()因为我想要调用我的DAO只是简单MyDAO myd = new MyDAO() 我不想为我的每个DAO创建接口.
这里有很多问题.
首先,我在您的小示例中计算JNDI查找字符串的三个引用.如果可能的话,DRY会告诉你写一次并参考它.
其次,我不太欣赏你的DAO.这真的是你在写什么,还是这只是一个例子?我不认为这是春天的成语.没有界面.没有一个,你将如何进行声明性交易?我建议更仔细地查看iBatis的Spring文档.
第三,我建议使用JUnit 4.4,或者更好的是,使用TestNG成语 - 注释.另请查看Spring @ContextConfiguration以在setUp中注入所需的bean.
第四,你的DAO无法工作,因为你需要运行JNDI查找服务,而你不能在没有容器的情况下获得它.答案是为测试提供DriverManager数据源.
更新:这是一个尝试的想法:使用iBatis的Spring成语.如果遗产阻止你这样做,也许春天不是你的答案.
完成此操作后,您所要做的就是覆盖数据源应用程序上下文,以便使用DriverManager而不是JNDI进行测试.
| 归档时间: |
|
| 查看次数: |
4894 次 |
| 最近记录: |