springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为的限定bean

springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为的限定bean,spring,spring-boot,mockito,Spring,Spring Boot,Mockito,我试图模拟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

我试图模拟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());

}
@Slf4j
@组成部分
@请求映射()
@塞特
公共类控制器{
//变量初始化
@自动连线
私有存储库;
public void sendData(RecordNo rocordNo、String xmlString、SomeFile file)引发ValidationException{
ClientHttPrequestFactoryRequestFactory=新建
HttpComponents客户端HttpRequestFactory(HttpClients.createDefault());
RestTemplate RestTemplate=新的RestTemplate(requestFactory);
列表试试这个,
将以下代码添加到控制器:

@Autowired
私有存储库;
public void setRepository(SomeRepository存储库){
this.repository=repository;}

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

@Autowired
私有存储库;
public void setRepository(SomeRepository存储库){

this.repository=repository;}

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

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

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

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

我在使用
@WebMvcTest
编写单元/集成测试时遇到了类似的问题,我通过将
@ComponentScan(“com.abc.center.entities.repositories”)
添加到
SomeController
(在您的例子中)来解决了这个问题.

我在使用
@WebMvcTest
编写单元/集成测试时遇到了类似的问题,我通过将
@ComponentScan(“com.abc.center.entities.repositories”)
添加到
SomeController
(在您的案例中)解决了这个问题.

@Setter annotation可以用于设置,也可以尝试这种方式,但不,它不起作用抱歉,我错过了。实际上,我不会使用@Mock,而是使用Autowired作为存储库,并在配置类中为其创建bean。@Setter annotation可以用于设置,也可以尝试这种方式,但不起作用抱歉,我错了事实上,我不会使用@Mock,而是使用Autowired for repository并在config class中为其创建bean。NoSuchBean定义异常:没有名为“entityManagerFactory”的bean可用,也无法再次为某个存储库创建内部bean默认情况下,entityManagerFactory不是免费提供的。您应该在配置文件中定义它ig.像这样,但我不明白为什么我们需要datasource来测试controller类,我在项目中的任何地方都没有这样做,试图模拟同一个存储库。还有application.properties中的所有内容。任何建议都会有帮助。我阅读了datasource的spring文档,但没有给出答案,因为您有
@Autowired
将您的存储库添加到控制器类中。存储库需要数据源。好的,您可以尝试
@springbootest
注释,而不是
@WebMvcTest
NoSuchBeanDefinitionException:没有名为“entityManagerFactory”的bean可用,也无法根据默认设置EntityManagerFac为某些存储库创建内部beantory不是免费提供的。你应该在你的配置中定义它。像这样,但我不明白为什么我们需要datasource来测试控制器类,我在项目中的任何地方都没有这样做,试图模拟同一个存储库。而且application.properties包含所有内容。任何建议都会有帮助我阅读spring文档ent用于数据源,但没有给出我的答案,因为您已将存储库
@Autowired
自动连接到控制器类中。存储库需要数据源。好的,您可以尝试
@springbootest
注释,而不是
@WebMvcTest