springframework.beans.factory.NoSuchBeanDefinitionException:没有类型为的限定bean
我试图模拟rest api调用,但在使用WebMvcTest测试控制器类时遇到错误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
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