Rest @WebMvcTest测试中的ApplicationContext异常
我有一个SpringBoot应用程序(1.5.10.RELEASE),其中包含一个主应用程序(SpringBootApplication),如下所示:Rest @WebMvcTest测试中的ApplicationContext异常,rest,unit-testing,spring-boot-test,Rest,Unit Testing,Spring Boot Test,我有一个SpringBoot应用程序(1.5.10.RELEASE),其中包含一个主应用程序(SpringBootApplication),如下所示: @springboot应用程序 @配置 @EntityScan(basePackages={“db.model”,“db.model.base”}) @ComponentScan(basePackages={“de.gui.test”}) 公共类SpringBootConsoleApplication{ 公共静态void main(字符串[]ar
@springboot应用程序
@配置
@EntityScan(basePackages={“db.model”,“db.model.base”})
@ComponentScan(basePackages={“de.gui.test”})
公共类SpringBootConsoleApplication{
公共静态void main(字符串[]args)引发异常{
run(SpringBootConsoleApplication.class,args);
}
}
和两个REST控制器,如下所示:
@RestController
@请求映射(“/as”)
公共类控制器{
@自动连线
私人储蓄;
@RequestMapping(method=RequestMethod.GET)
公众反应{
返回新的ResponseEntity(orgtfarbereposition.findAll(),HttpStatus.OK);
}
@RequestMapping(value=“/{id}”,method=RequestMethod.GET)
公共响应属性getA(@PathVariable long id){
A=一个假定的findOne(id);
如果(参与方!=null){
返回新的ResponseEntity(ARepository.findOne(id),HttpStatus.OK);
}否则{
返回新的ResponseEntity(null,HttpStatus.NOT_FOUND);
}
}
}
此外,我还有一个这样的测试:
@RunWith(SpringRunner.class)
@WebMvcTest(AController.class)
公共类控制器测试{
@自动连线
私有MockMvc;
@蚕豆
私人储蓄;
@试验
public void firstTest()引发异常{
A=新的aFarbe();
a、 设置。。。。
when(ARepository.findAll()).thenReturn(Collections.singleton(a));
mvc.perform(
获取(“/as”)
.accept(MediaType.APPLICATION\u JSON\u UTF8\u值)
)
.andExpect(status().isOk());
}
}
存储库如下所示:
公共接口ARepository扩展了Crudepository
{
集合findAll();
}
公共接口BRepository扩展了CRUDepository
{
集合findAll();
}
A和B本身是JPA注释类。整个应用程序包含对数据库的访问
此外,我还有这样的服务:
@服务
公共类XService{
私有静态最终记录器Logger=LoggerFactory.getLogger(XService.class);
@自动连线
私人储蓄;
@自动连线
私人储蓄;
...
}
XService不是通过@Autowire或其他方式使用的(只需删除该项):
因此,我尝试运行AControllerTest,但出现以下错误:
java.lang.IllegalStateException:无法在处加载ApplicationContext
org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
.. .. 在
org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206)
原因:
org.springframework.beans.factory.unsatifiedDependencyException:
创建名为“XService”的bean时出错:未满足依赖关系
通过字段“BRepository”表示;嵌套异常是
org.springframework.beans.factory.noSuchBean定义异常:否
“BRepository”类型的合格bean可用:至少应为1
符合autowire候选资格的bean。依赖项批注:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
.. .. 在
org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120)
在
org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98)
在
org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116)
... 又有26宗由以下原因引致:
org.springframework.beans.factory.noSuchBean定义异常:否
“BRepository”类型的合格bean可用:至少应为1
符合autowire候选资格的bean。依赖项批注:
{@org.springframework.beans.factory.annotation.Autowired(required=true)}
在
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.AutoWiredNotationBeanPostProcessor$AutoWiredFeldElement.inject(AutoWiredNotationBeanPostProcessor.java:585)
... 44多
我的假设是,在测试过程中,启动的上下文比应该的要多。问题是我怎样才能防止这种情况发生?这意味着只需要开始AControler的上下文,而不需要更多?我认为基于
@WebMvcTest(AController.class)
它应该已经受到限制,看起来情况并非如此……参考答案并没有真正回答我的问题,但a在上下文a中给出了解决方案。这意味着在我的测试中添加以下内容:
因此,我必须添加@OverrideAutoConfiguration(enabled=true)
:
@RunWith(SpringRunner.class)
@WebMvcTest(OrgtFarbenController.class)
@OverrideAutoConfiguration(已启用=真)
公共类控制器测试{
...
}
参考答案并没有真正回答我的问题,但a在上下文a中给出了解决方案。这意味着在我的测试中添加以下内容:
因此,我必须添加@OverrideAutoConfiguration(enabled=true)
:
@RunWith(SpringRunner.class)
@WebMvcTest(OrgtFarbenController.class)
@OverrideAutoConfiguration(已启用=真)
公共类控制器测试{
...
}