awwang
流浪回来的狗
采纳率0%
2017-09-01 09:42 阅读 2.9k

springboot+mybatis(xml模式) 项目 单元测试 报错。

2017-09-01 17:35:21.034 INFO 11212 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.lxhw.module.jbxx.dao.DjKjfCzryDao.getCzry

at org.apache.ibatis.binding.MapperMethod$SqlCommand.<init>(MapperMethod.java:230)
at org.apache.ibatis.binding.MapperMethod.<init>(MapperMethod.java:48)
at org.apache.ibatis.binding.MapperProxy.cachedMapperMethod(MapperProxy.java:65)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:58)
at com.sun.proxy.$Proxy98.getCzry(Unknown Source)
at com.lxhw.module.jbxx.service.DjKjfCzryService.getCzry(DjKjfCzryService.java:47)
at com.lxhw.module.jbxx.service.DjKjfCzryService$$FastClassBySpringCGLIB$$30938009.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673)
at com.lxhw.module.jbxx.service.DjKjfCzryService$$EnhancerBySpringCGLIB$$428d2624.getCzry(<generated>)
at com.lxhw.module.jbxx.service.DjKjfCzryServiceTest.searchCzry(DjKjfCzryServiceTest.java:21)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
这个是报错信息

项目运行正常,就是不能单元测试

初步估计是DjKjfCzryDao.class和DjKjfCzryDao.xml没有匹配上。但是run application是正常的,只有junit的时候有问题 是不是和引入mybais-spring-boot-starter有关系,不能自动去取配置文件了。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

7条回答 默认 最新

  • yjheaton yjheaton 2018-02-11 03:40

    我也遇到类似的问题,网上收罗了一大堆,基本都是答非所问,这个问题,我采用的办法的就是把Mapper.xml全部拷贝都test-classes,然后跑junit就OK,
    否则都会报找不到Mapper.xml,看了日志启动时扫描classpath为

     for files matching pattern [D:/codes/cms/common/*****/target/test-classes/**/*Mapper.xml]
    

    所以根本加载不到classes下的xml文件,

    要么直接使用非junit环境使用内嵌h2直接浏览器或curl测试

    这个问题是最近学习springboot时遇到,目前还没找到办法,囧

    点赞 1 评论 复制链接分享
  • awwang 流浪回来的狗 2017-09-01 09:43

    引入mybatis-spring-boot-starter-test 也没有效果。
    pom.xml:
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">

    com.lxhw
    sqypt
    1.0-SNAPSHOT

    4.0.0
    sqypt-service
    war
    sqypt-service Maven Webapp
    http://maven.apache.org


    org.springframework.boot
    spring-boot-starter-web


    org.springframework.boot
    spring-boot-starter-test
    test


    org.springframework.cloud
    spring-cloud-starter-eureka


    org.springframework.cloud
    spring-cloud-starter-eureka-server


    org.springframework.cloud
    spring-cloud-starter-feign

    <!--spring-boot mybatis依赖-->

    org.mybatis.spring.boot
    mybatis-spring-boot-starter
    1.2.0

        <dependency>
            <groupId>com.jslsolucoes</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>11.2.0.1.0</version>
        </dependency>
    
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>
    
        <!--in order to pack and deployment to tomcat-->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
    
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.1.1</version>
        </dependency>
    
        <!-- commons -->
        <dependency>
            <groupId>commons-dbcp</groupId>
            <artifactId>commons-dbcp</artifactId>
            <version>1.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.8</version>
        </dependency>
        <dependency>
            <groupId>commons-net</groupId>
            <artifactId>commons-net</artifactId>
            <version>3.2</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
    
    
        <!-- pojo copy -->
        <dependency>
            <groupId>net.sf.dozer</groupId>
            <artifactId>dozer</artifactId>
            <version>5.5.1</version>
        </dependency>
    
        <!--validation-->
        <dependency>
            <groupId>javax.validation</groupId>
            <artifactId>validation-api</artifactId>
            <version>1.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
    </dependencies>
    <build>
        <finalName>sqypt-service</finalName>
        <plugins>
            <!-- 编码和编译和JDK版本 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                    <encoding>utf8</encoding>
                </configuration>
            </plugin>
        </plugins>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.yml</include>
                    <include>**/*.properties</include>
                </includes>
            </resource>
        </resources>
    </build>
    

    点赞 评论 复制链接分享
  • awwang 流浪回来的狗 2017-09-01 09:45

    application.yml:
    spring:
    profiles:
    active: dev
    application:
    name: sqypt-service
    http:
    multipart:
    maxFileSize: 50Mb
    maxRequestSize: 50Mb
    datasource:
    url: jdbc:oracle:thin:@localhost:1521:wtdzdk
    username: YZDK_SX_YH
    password: YZDK_SX_PASSWORD
    driver-class-name: oracle.jdbc.driver.OracleDriver
    type: com.alibaba.druid.pool.DruidDataSource
    initialSize: 5
    minIdle: 5
    maxActive: 20
    maxWait: 60000
    timeBetweenEvictionRunsMillis: 60000
    minEvictableIdleTimeMillis: 300000
    validationQuery: SELECT 1 FROM DUAL
    testWhileIdle: true
    testOnBorrow: false
    testOnReturn: false
    poolPreparedStatements: false
    maxPoolPreparedStatementPerConnectionSize: 20
    filters: stat,wall,log4j
    connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000

    server:
    port: 1002

    eureka:
    instance:
    prefer-ip-address: true
    client:
    serviceUrl:
    defaultZone: http://localhost:1001/eureka/
    logging:
    level:
    com:
    lxhw: DEBUG
    mybatis:
    mapper-locations: classpath:com/lxhw/**/map/*.xml
    type-aliases-package: com.lxhw

    page.pageSize: 20

    点赞 评论 复制链接分享
  • awwang 流浪回来的狗 2017-09-01 09:46

    测试类:
    package com.lxhw.module.jbxx.service;

    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;

    /**

    • Created by syf on 2017-08-26.
      */
      @RunWith(SpringRunner.class)
      @SpringBootTest
      public class DjKjfCzryServiceTest {

      @Autowired
      DjKjfCzryService djKjfCzryService;

      @Test
      public void searchCzry() throws Exception {
      djKjfCzryService.getCzry("36AAC4BC8D5F47589A91581285AD0B0E");
      }

      @Test
      public void searchCzry2() throws Exception {
      djKjfCzryService.getCzry("36AAC4BC8D5F47589A91581285AD0B0E");
      }
      }

    点赞 评论 复制链接分享
  • Small_Mouse0 鼠小 2017-09-01 11:40

    Invalid bound statement (not found): com.lxhw.module.jbxx.dao.DjKjfCzryDao.getCzry,,,,这个方法可能有问题

    我估计,题主这个对象里有的参数没设置好,djKjfCzryService

    调用getCzry("36AAC4BC8D5F47589A91581285AD0B0E");时出问题了,,,

    点赞 评论 复制链接分享
  • awwang 流浪回来的狗 2017-09-01 12:02

    再次强调run application 没问题,单元测试的时候有问题。应该是MyBatisTest 测试找不到相应的配置文件

    点赞 评论 复制链接分享
  • yjheaton yjheaton 2018-02-11 06:53

    找一个比较妥善的办法

    src/test/resources/application-test.properties配置文件中加载xml全部配置为从file://路径下加载,并且全部指定到src/main/下
    这样就不需要在src/test目录下再拷贝或创建xml了,亲测OK

    mybatis.config=file:///${user.dir}/src/main/resources/jpaConfig.xml
    mybatis.mapper-locations=file:///${user.dir}/src/main/**/*Mapper.xml
    spring.datasource.platform=h2
    spring.datasource.schema=file:///${user.dir}/src/main/resources/schema.sql
    spring.datasource.data=file:///${user.dir}/src/main/resources/data.sql
    
    

    另外注意下单元测试类注解

    @RunWith(SpringJUnit4ClassRunner.class)
    // 可以只加载需要的class,加载启动类,就是启动整个springboot容器
    @SpringBootTest(classes=**springboot启动类**)
    @ActiveProfiles("**test**")
    
    
    点赞 评论 复制链接分享

相关推荐