@WebMvcTest mapperscan冲突

时间:2016-08-12 07:52:12

标签: spring-boot

我的项目使用了spring-boot(1.4.0.release)和mybatis-spring-boot-starter。当我尝试为控制器提供一些测试代码时,我总是得到一个异常

Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
at org.springframework.util.Assert.notNull(Assert.java:115)
at org.mybatis.spring.support.SqlSessionDaoSupport.checkDaoConfig(SqlSessionDaoSupport.java:75)
at org.mybatis.spring.mapper.MapperFactoryBean.checkDaoConfig(MapperFactoryBean.java:74)
at org.springframework.dao.support.DaoSupport.afterPropertiesSet(DaoSupport.java:44)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
... 42 more`

但是当我评论@MapperScan("com.toby.mapper")时,它运行得非常好。 这是我的示例类:



@MapperScan("com.toby.mapper")
@EnableTransactionManagement
@EnableConfigurationProperties(AppConfig.class)
@SpringBootApplication(scanBasePackages = "com.toby.configuration,com.toby.web.controller,com.toby.service,com.toby.dao")
public class Example {

    public static void main(String[] args) throws Exception {
        //new SpringApplicationBuilder().sources(Example.class).run(args);
        SpringApplication application=new SpringApplication(Example.class);
        application.addInitializers(new PropertyPasswordDecodingContextInitializer());
        application.run(args);
    }

}




这是我的测试代码:



package com.toby.web.controller;

import com.toby.common.config.AppConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;

/**
 * Created by Toby on 2016/8/10.
 */
@RunWith(SpringRunner.class)
@WebMvcTest(value = MyRestController.class)
public class MyRestControllerTests {
    @Autowired
    private MockMvc mvc;

    @MockBean
    private AppConfig appConfig;

    @Test
    public void testHome() throws Exception {
        /*this.mvc.perform(get("/users").accept(MediaType.TEXT_PLAIN))
                .andExpect(status().isOk()).andExpect(content().string("Honda Civic"));*/
    }
}




1 个答案:

答案 0 :(得分:1)

我猜您已经更新了说明,或者我第一次没有正确阅读。 @MapperScan是一个特定于mybatis的注释,可触发某些内容但却缺少某种类型的后卫。

我们在启动时遇到了同样的问题。假设您将@EnableCaching放在主应用上。由于切片会禁用所有自动配置,但会禁用特定列表,因此缓存自动配置不会启动,因为找不到CacheManager,您将收到异常。为了解决这个问题,我们已经开始创建一些注释来轻松启用它们。如果查看WebMbcTest,除非另有说明,否则您将看到它使用AutoConfigureCache注释,它将提供一个虚拟的无操作缓存管理器。

您的问题是mybatis支持是第三方集成,并且没有任何支持。一些解决方案:

  • 更改@WebMbvcTest以提供另一个配置类的类,有效地禁用主弹簧启动应用程序的使用。当然,该类不应定义@MapperScan注释
  • MapperScan(以及切片不需要的任何内容)移动到另一个Configuration类。它可以是与您的应用程序在同一个程序包中的类。切片不会默认扫描那些,所以你会没事的。这是迄今为止最简单的
  • 在mybatis支持中创建一个问题,以便他们改进自动配置以退避(防止此异常)。我不确定实际上是否可能

长话短说,因为@MapperScan是一种告诉mybatis扫描你的实体的方法,如果你使用切片,也许你不应该在主启动应用上添加它。因为您的@WebMbcTest显然不想使用它。