【问题解决】在 MyBatis 的测试中,出现了“找不到符合条件的 bean 类型~”的错误
环境
-
- mybatis-spring-boot-starter: 1.3.1
mybatis: 3.4.5
mybatis-spring-boot-starter-test: 1.3.1
postgresql jdbc : 42.1.4
Spring Boot 1.5.9
Java8
PostgreSQL 9.6
我想做的事情。
我正在使用MyBatis访问数据库。
我现在想要执行HotelDao.java中findById方法的测试。
@Component
public class HotelDao {
private final SqlSession sqlSession;
public HotelDao(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public Hotel findById(long id) {
return this.sqlSession.selectOne("findHotelById", id);
}
}
請問有什麼問題需要解答呢?
我已经创建了一个测试代码来验证findById方法的正确性。
@RunWith(SpringRunner.class)
@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
public class HotelDaoTest {
@Autowired
private HotelDao hotelDao;
@Test
public void test() {
Hotel hotel = hotelDao.findById(1);
System.out.println(hotel);
}
}
当使用JUnit来执行测试方法时,以下错误会显示在控制台上。
2018-01-24 23:03:54.990 ERROR 22456 --- [ main] o.s.test.context.TestContextManager : Caught exception while allowing TestExecutionListener [org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener@6a472554] to prepare test instance [com.example.demo2.mybatis.dao.HotelDaoTest@275710fc]
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'com.example.demo2.mybatis.dao.HotelDaoTest':
Unsatisfied dependency expressed through field 'hotelDao'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException:
No qualifying bean of type 'com.example.demo2.mybatis.dao.HotelDao' available: expected at least 1 bean which qualifies as autowire candidate.
Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
...
为了易读起见,我在适当的位置加入了换行符。
因由
在最后的错误信息中,显示“找不到符合条件的bean类型 ‘~.HotelDao’:至少需要一个符合自动装配候选的bean。”也就是说,它声明找不到HotelDao的bean。
当给予@MyBatisTest注解时,由于@Component的bean不会被加载,因此似乎找不到bean。
同时,常规的@Component bean不会被加载到应用程序上下文中。
※ 引用 http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/
解决问题
使用@Import注解来加载HotelDao的bean。
@RunWith(SpringRunner.class)
@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
@Import(HotelDao.class)
public class HotelDaoTest {
@Autowired
private HotelDao hotelDao;
@Test
public void test() {
Hotel hotel = hotelDao.findById(1);
System.out.println(hotel);
}
}
http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-test-autoconfigure/#Test_for_DAO_pattern: 请查看
填補
如果使用@Mapper注解,@Import是不需要的。
@Mapper
public interface CityMapper {
@Select("select * from city")
City findCity();
}
@RunWith(SpringRunner.class)
@MybatisTest
@AutoConfigureTestDatabase(replace = Replace.NONE)
public class CityMapperTest {
@Autowired
CityMapper cityMapper;
@Test
public void test() {
City city = cityMapper.findCity();
System.out.println(city);
}
}
参考自的网站
-
- Spring BootでNo qualifying bean of typeが出た時の原因と対応
-
- mybatis-spring-boot-starter 1.3の変更点
- MybatisTest.java – GitHub