【问题标题】:springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of typespringframework.beans.factory.NoSuchBeanDefinitionException:没有符合条件的 bean 类型
【发布时间】:2017-09-13 14:02:10
【问题描述】:

我正在尝试模拟 rest api 调用,但在使用 WebMvcTest 测试控制器类时遇到错误,

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.abc.center.entities.repositories.SomeRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1486)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
    ... 41 more

我有一个类似这样的项目结构,

我尝试了很多方法,但没有运气,下面是我的 restcontroller 及其 Mockito 测试类和存储库,

@Slf4j
@Component
@RequestMapping()
@Setter
public class SomeController {

    // Variable initialization

    @Autowired
    private  SometRepository someRepository;

        public void sendData(RecordNo rocordNo, String xmlString, SomeFile file) throws  ValidationException{
        ClientHttpRequestFactory requestFactory = new
                HttpComponentsClientHttpRequestFactory(HttpClients.createDefault());
        RestTemplate restTemplate = new RestTemplate(requestFactory);

        List<HttpMessageConverter<?>> messageConverters = new ArrayList<>();
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));

        restTemplate.setMessageConverters(messageConverters);

        MultiValueMap<String,String> header = new LinkedMultiValueMap<>();
        header.add("x-api-key",api_key);
        header.add("Content-Type",content_type);
        header.add("Cache-Control",cache_control);
        HttpEntity<String> request = new HttpEntity<>(xmlString, header);

        try {
            restTemplate.postForEntity(getUri(rocordNo,file), request, String.class);
        }catch (RestClientResponseException e){
            throw new ValidationException(e.getResponseBodyAsString());
        }

    }

    getUri(RecordNo rocordNo SomeFile file){
        // here I need someRepository which is an interface
    }

}


public interface TestRepository extends PagingAndSortingRepository<RecordNo, Integer> {
    //queries to repositories
}


@RunWith(SpringJUnit4ClassRunner.class)
@WebMvcTest(SomeController.class)
public class SomeControllerTestClass {

private TestController serviceToTest;

    private  String xmlString = "String";


    private MockMvc mockMvc;

    @Autowired
    private WebApplicationContext wac;

    @Mock
    private TestRepository testRepository;

    @Before
    public  void init(){
        serviceToTest.setTestRepository(testRepository);
        this.mockMvc = MockMvcBuilders.webAppContextSetup(wac).build();
        MockitoAnnotations.initMocks(this);
    }

    @Test
    public void verifySafe2Call() throws  Exception{
        mockMvc.perform(MockMvcRequestBuilders.post("someuri")
                .contentType(MediaType.APPLICATION_XML)
        .accept(MediaType.APPLICATION_JSON)
        .content(xmlString)).andExpect(jsonPath("$.responseMessage").value("Validation succeeded"))
        .andExpect(jsonPath("$.responseCode").value("SUCCESS"))
                .andDo(print());

}

我的项目结构有问题吗?我知道它无法找到定义,但不知道为什么会这样。 任何建议都会很好。

【问题讨论】:

    标签: spring spring-boot mockito


    【解决方案1】:

    试试这个, 将以下代码添加到控制器:

    @Autowired private SometRepository someRepository; public void setRepository(SomeRepository repository) { this.repository = repository;}

    【讨论】:

    • @Setter 注释可以起到设置的作用,也可以尝试这种方式,但它不起作用
    • 对不起,我错过了。实际上,我不会使用@Mock,而是使用 Autowired 作为存储库并在配置类中为其创建 bean。
    【解决方案2】:

    我没有看到 @EnableJpaRepositories 注释。 您的配置应使用此注解进行注解,Spring 将扫描所需的包以查找存储库。

    @Configuration
    @EnableJpaRepositories(basePackages = {"com.abc.center.entities.repositories"})
    public class JpaConfig {
    }
    

    【讨论】:

    • NoSuchBeanDefinitionException: 没有名为 'entityManagerFactory' 的 bean 可用并且也无法再次为 someRepository 创建内部 bean
    • 默认情况下,EntityManagerFactory 不是免费的。您应该在配置中定义它。像这样stackoverflow.com/a/28603097/5207023
    • 但是我不明白为什么我们需要数据源来测试控制器类,我没有在项目的任何地方尝试模拟同一个存储库。并且 application.properties 包含所有内容。任何建议都会有帮助,我阅读了数据源的 spring 文档,但没有给出答案
    • 因为你有@Autowired你的存储库进入控制器类。存储库需要数据源。
    • 好的,你可以试试@SpringBootTest注解代替@WebMvcTest
    【解决方案3】:

    我在用@WebMvcTest 编写单元/集成测试时遇到了类似的问题,我通过将@ComponentScan("com.abc.center.entities.repositories") 添加到SomeController(在你的情况下)来解决它。

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 2018-12-20
      • 2023-03-26
      相关资源
      最近更新 更多