我的项目使用了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"));*/
}
}

答案 0 :(得分:1)
我猜您已经更新了说明,或者我第一次没有正确阅读。 @MapperScan
是一个特定于mybatis的注释,可触发某些内容但却缺少某种类型的后卫。
我们在启动时遇到了同样的问题。假设您将@EnableCaching
放在主应用上。由于切片会禁用所有自动配置,但会禁用特定列表,因此缓存自动配置不会启动,因为找不到CacheManager
,您将收到异常。为了解决这个问题,我们已经开始创建一些注释来轻松启用它们。如果查看WebMbcTest
,除非另有说明,否则您将看到它使用AutoConfigureCache
注释,它将提供一个虚拟的无操作缓存管理器。
您的问题是mybatis支持是第三方集成,并且没有任何支持。一些解决方案:
@WebMbvcTest
以提供另一个配置类的类,有效地禁用主弹簧启动应用程序的使用。当然,该类不应定义@MapperScan
注释MapperScan
(以及切片不需要的任何内容)移动到另一个Configuration
类。它可以是与您的应用程序在同一个程序包中的类。切片不会默认扫描那些,所以你会没事的。这是迄今为止最简单的长话短说,因为@MapperScan
是一种告诉mybatis扫描你的实体的方法,如果你使用切片,也许你不应该在主启动应用上添加它。因为您的@WebMbcTest
显然不想使用它。