Spring Boot JPA 测试 bean 不在上下文中

Posted

技术标签:

【中文标题】Spring Boot JPA 测试 bean 不在上下文中【英文标题】:SpringBoot JPA test beans not in context 【发布时间】:2018-04-03 05:39:26 【问题描述】:

我想不通。出于某种原因,Spring Junit 没有将我的 bean 添加到上下文中。求救!!

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有“com.api.demo.store.FileStorage”类型的合格 bean 可用:预计至少有 1 个有资格作为自动装配候选者的 bean。依赖注解:@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=com.api.demo.store.FileStorageMemDB) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) 在 org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) 在 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ... 28 更多

@RunWith(SpringRunner.class)
@SpringBootTest
public class FileStorageMemDBTest 

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private FileStorage fileStorage;

    @Autowired private ApplicationContext ctx;

    @Test
    public void testRetrieveAll() 



        FileInfo fileInfo = new FileInfo("fileOne", "GoodFile.txt", "test");

       entityManager.persist(fileInfo);
            fileStorage.retrieveAllFiles();

    




@Service
public interface FileStorage 
    /**
     * Stores file in an underlying file store
     *
     * @param File     to store
     * @param FileInfo file submission metadata
     */
    public void store(MultipartFile mFile, FileInfo info) throws IOException;

    /**
     * Retrieves a list of all file
     *
     * @return array containing file metadata
     */
    public List<FileInfo> retrieveAllFiles();

    /**
     * Retrieve file metadata by id
     *
     * @return file metadata if found
     * @Param id of a file to retrieve
     */
    public FileInfo retrieveFileMetadata(Long id);


   /**
 * Database implementation of FileStorage interface
 *
 */
@Transactional
@Service
public class FileStorageMemDB implements FileStorage 

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void store(MultipartFile incomingFile, FileInfo info) throws IOException 

        ......

        entityManager.persist(info);
    

    @Override
    public List<FileInfo> retrieveAllFiles() 

        return entityManager.createNamedQuery("query_find_all_records", FileInfo.class).getResultList();
    


    @Override
    public FileInfo retrieveFileMetadata(Long id) 
        return entityManager.find(FileInfo.class, id);
    



【问题讨论】:

你能试试@SpringBootTest(classes = App.class),其中App.class是你的主类,用@SpringBootApplication注解吗? 【参考方案1】:

感谢瓦伦,

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class FileStorageMemDBTest 

...

做到了。 !!

【讨论】:

如果它有助于解决您的问题,您可以并且应该接受您的回答。

以上是关于Spring Boot JPA 测试 bean 不在上下文中的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot Data JPA 的问题 - 创建名称为 [重复] 的 bean 时出错

Spring Boot 中 JPA 存储库的“没有限定类型的 bean”

Spring boot(带有 jpa 的 mysql):没有名为“entityManagerFactory”的 bean 可用

Spring Boot-------JPA——EntityManager构建通用DAO

具有 JPA 依赖关系的 Flyway Spring Boot Autowired Bean

添加spring boot jpa依赖项时创建名称为“entityManagerFactory”的bean时出错