【问题解决】在 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
广告
将在 10 秒后关闭
bannerAds