这可能与iBatis + spring有关

时间:2009-11-10 22:05:25

标签: java unit-testing spring ibatis

使用带有弹簧支撑的ibatis的常用习惯如下。或者这就是我这样做的方式。请告诉我是否可以采取更好的方式?

beans xml:

<bean id="DataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/some/som1/my/mydb"/>
</bean>
<bean id="SqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  <property name="configLocation" value="classpath:sql-map-config-oracle.xml"/>
  <property name="dataSource" ref="DataSource"/>
</bean>
 <bean id="myDAO" class="com.reports.MyUserAccessDAO">
    <property name="sqlMapClient" ref="SqlMapClient"/>
    <property name="dataSource" ref="DataSource"/>
 </bean>

接口

public interface MyUserAccessIface {
    public SomeBean getUserReports (String org);
}

DAO:

public class MyUserAccessDAO extends SqlMapClientDaoSupport implements MyUserAccessDAO {
    public SomeBean getUserReports (String org)
    {
      SomeBean bean = new SomeBean();
      //code for parameters goes here 
      getSqlMapClientTemplate().queryForList("namesp.userreport", parm);
      //fetch the result from parm and put them in SomeBean
      return bean
    }
}

调用DAO:

MyUserAccessIface iBatisDAO = 
(MyUserAccessIface) ApplicationInitializer.getApplicationContext().getBean("myDAO");

即使这样工作正常我也不明白对界面的需求。

问题

  • 接口是否可以取出 图片仍然有这个工作吗?
  • 可以改变设计/设置 对DAO的调用很简单(即使需要基本的抽象类)

    MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports( “嗒嗒”);

几天后我就一直问这些问题,但经过2天的努力并找到更多的东西后,我现在又问了这个问题。如果可能,请提供您要更改/添加的内容的代码段。

使用此设计进行单元测试不起作用,因为所有内容都位于容器内。如果我能够正常工作,那么我也会将其添加到问题中(出于信息目的)。

此外,我认为有人试图让spring + ibatis工作......这最终会成为一个好的起点。

修改

就像我上面提到的那样,我想像这样调用我的DAO(或者我可以将一些东西作为构造函数参数传递):

MyUserAccessDAO mydao = new MyUserAccessDAO(); mydao.getUserReports("blah");

为了实现上述目标,我将在DAO中使用以下行

setSqlMapClient((SqlMapClient)ApplicationInitializer.getApplicationContext().getBean("SqlMapClient"));

还需要知道所有要覆盖的内容才能为此编写测试用例。测试用例将无法访问容器内的任何内容,因此它将依赖于Driver Datasource ...

由于我反对这里的最佳做法...我不介意只为测试用例改变我的DAO ......

3 个答案:

答案 0 :(得分:2)

  

接口是否可以从图片中取出并仍然可以正常工作?

不要取出界面。这是有充分理由的(例如,交易的代理生成,AOP,服务测试的模拟等)。

你为什么要把它拿出来?它给你带来了什么焦虑?

  

可以更改设计/设置,以便简单地调用DAO(即使需要基本抽象类)

你为什么叫“新”?如果你正在使用Spring,你应该使用App Context注入它。如果你打电话给“新”,它不受Spring的控制。这应该是重点。

答案 1 :(得分:0)

接口可以将您与直接依赖于实现分离,这通常是一种很好的做法。它应该在没有接口的情况下工作正常,但最好依赖于抽象而不是实现。

至于测试,通过使用界面,使用 DAO来测试代码变得容易得多,因为你可以创建一个“模拟”实现,只返回虚拟数据和“在你的单元测试中手动注入“ - 你的客户端代码无法区分它和真正的DAO,因为它所知道的只是接口。

答案 2 :(得分:0)

我可以想到取出界面的一个主要原则会打破......'面向对象',最重要的是,无法在不中断调用代码的客户端的情况下更改方法签名。仅此一点就会阻止我走上正轨。很好的问题!!在许多活动中,我经常被问到这个问题。或者只是人们想要编程来抽象类。 =)