ibatis单元测试出现The error occurred while loading SqlMap -initialize type alias解决办法

ibatis项目运行正常,但是在单元测试时如果出现类似下面的异常:  
  The error occurred while loading SqlMap. 
- initialize type alias 
- The error occurred in <sqlMap embedded="XXX.XXX.xml,XXModel.XXX" xmlns=" http://ibatis.apache.org/dataMapper" />.   
- Check the XXX.XXX, XXModel.XXX.]
解决办法有两种:
1.将单元测试工程设为启动项即可。
2.如果单元测试工程不设置为启动项,那么就需要在调用ibatis方法之前,new 一个所需的实体对象。

解释:
追踪到ibatis内核代码中,发现IBatisNet.Common.Utilities.TypesResolver类中有一个LoadTypeByIteratingOverAllLoadedAssemblies方法,
        它的作用就是用反射的方式为TypeAlias节点map出对应的自定义实体类。
        
private static Type LoadTypeByIteratingOverAllLoadedAssemblies(TypeAssemblyInfo typeInfo)
        { 
            Type type = null;
            Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
            foreach (Assembly assembly in assemblies) 
            {
                type = assembly.GetType(typeInfo.TypeName, false, false); 
                if (type != null) 
                {
                    return type; 
                } 
            } 
            return type; 
        }
可以看到它用AppDomain.CurrentDomain.GetAssemblies()方法取得程序集,然后在这些程序集中按类名反射得到实体类型。问题就出在这里。如果你的实体类在一个不同于启动项目的程序集中,而且在你用ibatis访问数据库之前,这个程序集所包含的对象从来没有激活过。那么,这个方法是得不到实体类对应的程序集的,也就说你TypeAlias节点指向的实体类找不到,才会报如上的错误。而且要注意的是,所有的typeAlias会在第一次ibatis访问数据库的时候一次性加载,不管你这次有没有用到。

所以,有一个解决办法是在你的project访问数据库之前,实例化一个typeAlias对应的类,AppDomain就会加载对应的程序集,加载typeAlias才不会报错。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值