开发者社区> 问答> 正文

关于Junit4 Spring中,sqlSession读取不到sql语句ID的问题:报错

在测试代码注入的Service中,sqlSession获取不到,导致了Mapper.xml中的sql语句读取不到

拜托高手帮忙看一下。

如下图


这是mybatis的

这是spring的


这是接口和sql



应该是spring扫描不到mapper.xml的东西

java.lang.AssertionError: Mapped Statements collection does not contain value for com.hitachi.overall.db.mapper.UserGroupsMapper.findById
    at org.junit.Assert.fail(Assert.java:92)
    at com.hitachi.overall.service.UserGroupServiceImplTest.testFindById01(UserGroupServiceImplTest.java:108)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
    at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

-**--*-

展开
收起
kun坤 2020-06-07 14:47:56 790 0
1 条回答
写回答
取消 提交回答
  • 工资好高吧!######看一下你的mybatis配置以及启动log######关于配置以及sql的文件都传上去了,拜托######日企外包的注释写的真好,自叹不如啊######说重点啊。。。 看代码,就那点东西,不知道为什么获取不到。。。######

    我自己写的mock有这个类

    @ContextConfiguration(locations = { "classpath:conf/appContext-dao-test.xml" })
    @TransactionConfiguration(defaultRollback = true)
    public abstract class AbstractRepositryTest extends
            AbstractTransactionalTestNGSpringContextTests {
    
    }



    这个类负责读取配置文件 datasource 以及sql xml,用于进行注入到service

    ######回复 @JacarriChan : src/test/resources/conf/appContext-dao-test.xml######appContext-dao-test.xml在src/test中?######

    引用来自“久欠幸福”的评论

    我自己写的mock有这个类

    @ContextConfiguration(locations = { "classpath:conf/appContext-dao-test.xml" })
    @TransactionConfiguration(defaultRollback = true)
    public abstract class AbstractRepositryTest extends
            AbstractTransactionalTestNGSpringContextTests {
    
    }



    这个类负责读取配置文件 datasource 以及sql xml,用于进行注入到service

    /** SpringFrameworkのテスト用定義ファイル. */
        private static final String[] LOCATIONS = {"test-spring-context.xml" };

        /** SpringFrameworkのコンテキスト. */
        private ApplicationContext context =
                new ClassPathXmlApplicationContext(LOCATIONS);

        /**
         * SpringFrameworkのコンテキストからBeanを取得します.
         * @param name Bean名
         * @return Bean名で指定されるオブジェクト
         */
        protected final Object getBean(final String name) {
            return context.getBean(name);
        }

    这里通过getBean注入的,sqlSession在这里没有获取到sqlId######麻烦把启动log贴出来。######是要错误的log吗,还是?######

    引用来自“JacarriChan”的评论

    麻烦把启动log贴出来。
    java.lang.AssertionError: Mapped Statements collection does not contain value for com.hitachi.overall.db.mapper.UserGroupsMapper.findById
        at org.junit.Assert.fail(Assert.java:92)
        at com.hitachi.overall.service.UserGroupServiceImplTest.testFindById01(UserGroupServiceImplTest.java:108)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
        at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    ######全部log######

    引用来自“JacarriChan”的评论

    麻烦把启动log贴出来。

    引用来自“zhuoxiaokai”的评论

    java.lang.AssertionError: Mapped Statements collection does not contain value for com.hitachi.overall.db.mapper.UserGroupsMapper.findById
        at org.junit.Assert.fail(Assert.java:92)
        at com.hitachi.overall.service.UserGroupServiceImplTest.testFindById01(UserGroupServiceImplTest.java:108)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
        at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
        at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
        at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
        at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:44)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
        at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
        at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
        at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
        at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
        at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
        at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

    回复 @JacarriChan : 不好意思,这是测试的case,没有启动的log,单独写的test-spring和test-mybatis的配置文件,junit4+spring+mybatis的结合测试,然后查了很长时间,配置文件检查了很多次也试了其他方法,没有解决,原因应该是
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- MyBatisの設定ファイルの場所 -->
        <property name="configLocation"  value="test-mybatis-config.xml" />
      </bean>
    这里spring没有扫描到test-mybatis-config.xml对应的mapper.xml的sql语句######

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    没有配置mapperLocations这个属性:告诉mybatis去哪里扫描映射文件

    ######回复 @JacarriChan : 非常感谢,这个问题扔给日本人解决去了,没时间再耽误在这个问题上了######把日志级别改成trace,然后把所有日志发给我.######真的很困惑啊######

    引用来自“JacarriChan”的评论

      <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

    没有配置mapperLocations这个属性:告诉mybatis去哪里扫描映射文件

    非常感谢您的回答,但是关于这个属性我也尝试过了

    如下:

    <!-- MyBatisのSqlSeessionFactoryの定義 -->

        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <!-- MyBatisの設定ファイルの場所 -->
        <property name="configLocation"  value="test-mybatis-config.xml" />
        <property name="mapperLocations" value="classpath*:com/hitachi/overall/db/mapper/*.xml" />

      </bean>

    但是同样没有扫描到

    另外关于mybatis.xml的mapers配置,我也查了资料说这里不需要配置

    <!--说明:如果xxMapper.xml配置文件放在和xxMapper.java统一目录下,mappers也可以省略,因为org.mybatis.spring.mapper.MapperFactoryBean默认会去查找与xxMapper.java相同目录和名称的xxMapper.xml-->


    2020-06-07 14:48:04
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
SQL Server在电子商务中的应用与实践 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载