如何集成测试使用spring + iBatis构建的DAO

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创建接口.

duf*_*ymo 6

这里有很多问题.

首先,我在您的小示例中计算JNDI查找字符串的三个引用.如果可能的话,DRY会告诉你写一次并参考它.

其次,我不太欣赏你的DAO.这真的是你在写什么,还是这只是一个例子?我不认为这是春天的成语.没有界面.没有一个,你将如何进行声明性交易?我建议更仔细地查看iBatisSpring文档.

第三,我建议使用JUnit 4.4,或者更好的是,使用TestNG成语 - 注释.另请查看Spring @ContextConfiguration以在setUp中注入所需的bean.

第四,你的DAO无法工作,因为你需要运行JNDI查找服务,而你不能在没有容器的情况下获得它.答案是为测试提供DriverManager数据源.

更新:这是一个尝试的想法:使用iBatisSpring成语.如果遗产阻止你这样做,也许春天不是你的答案.

完成此操作后,您所要做的就是覆盖数据源应用程序上下文,以便使用DriverManager而不是JNDI进行测试.