Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对扩展SqlMapClientDaoSupport的DAO进行单元测试_Java_Spring_Ibatis_Easymock - Fatal编程技术网

Java 如何对扩展SqlMapClientDaoSupport的DAO进行单元测试

Java 如何对扩展SqlMapClientDaoSupport的DAO进行单元测试,java,spring,ibatis,easymock,Java,Spring,Ibatis,Easymock,springda帮助编写dao。当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做。SqlMapClientTemplate不是一个接口,EasyMock无法为它创建一个模拟。DAO和单元测试相处不好! 在不包含任何业务逻辑且专注于数据库访问的组件中模拟任何内容是没有意义的。 您应该尝试编写一个集成测试。查看spring参考文档,第8.3章:试试看。它允许模拟类,而不仅仅是接口。这正是我不从SqlMa

springda帮助编写dao。当使用iBATIS作为持久性框架并扩展SqlMapClientDaoSupport时,应该为DAO设置SqlMapClient模拟,但我不能这样做。SqlMapClientTemplate不是一个接口,EasyMock无法为它创建一个模拟。

DAO和单元测试相处不好! 在不包含任何业务逻辑且专注于数据库访问的组件中模拟任何内容是没有意义的。
您应该尝试编写一个集成测试。查看spring参考文档,第8.3章:

试试看。它允许模拟类,而不仅仅是接口。

这正是我不从
SqlMapClientDaoSupport
扩展的原因。相反,我向
SqlMapClientTemplate
(输入为接口
SqlMapClientOperations
)注入了一个依赖项。下面是一个Spring 2.5示例:

@Component
public class MyDaoImpl implements MyDao {

    @Autowired
    public SqlMapClientOperations template;

    public void myDaoMethod(BigInteger id) {
        int rowcount = template.update("ibatisOperationName", id);
    }
}

正如@Banengusk所建议的,这可以通过以下方式实现。但是,确定DAO将使用一个Spring
SqlMapClientTemplate
包装您的模拟
SqlMapClient
,这一点很重要。实际上,
SqlMapClientTemplate
将调用委托给IBatis层中的
SqlMapSession

因此,需要一些额外的模拟设置:

mockSqlMapSession = mock(SqlMapSession.class);
mockDataSource = mock(DataSource.class);

mockSqlMapClient = mock(SqlMapClient.class);
when(mockSqlMapClient.openSession()).thenReturn(mockSqlMapSession);
when(mockSqlMapClient.getDataSource()).thenReturn(mockDataSource);

dao = new MyDao();
dao.setSqlMapClient(mockSqlMapClient);
然后,我们可以验证这样的行为:

Entity entity = new EntityImpl(4, "someField");
dao.save(entity);

ArgumentCaptor<Map> params = ArgumentCaptor.forClass(Map.class);
verify(mockSqlMapSession).insert(eq("insertEntity"), params.capture());
assertEquals(3, params.getValue().size());
assertEquals(Integer.valueOf(4), params.getValue().get("id"));
assertEquals("someField", params.getValue().get("name"));
assertNull(params.getValue().get("message"));
Entity Entity=newentityimpl(4,“someField”);
保存(实体);
ArgumentCaptor params=ArgumentCaptor.forClass(Map.class);
验证(mockSqlMapSession).insert(eq(“insertEntity”),params.capture();
assertEquals(3,params.getValue().size());
assertEquals(Integer.valueOf(4),params.getValue().get(“id”);
assertEquals(“someField”,params.getValue().get(“name”);
assertNull(params.getValue().get(“消息”));

虽然我可以看到您的逻辑,但我可以设想DAO功能可以从单元测试中受益。因此,我认为说DAO不应该进行单元测试是不公平的——这完全取决于所讨论的类。这也是组合优于继承的另一个原因。