我想测试一些包含其他autowired服务的服务。但这些“外部”服务对于测试本身并不是必需的。
我如何创建一个测试设置,例如下面的例子?
package de.myapp.service;
@Service
public class MyServiceDelegator {
@Autowired
private List<ServiceInterface> services;
public ServiceInterface delegate(String id) {
//routine to find the right ServiceInterface based on the given id
}
}
@Service
public class MyService implements ServiceInterface {
}
@Service
public class MyCustomService implements ServiceInterface {
//that is the problem during testing
@Autowired
private de.myapp.repository.SomeDao dao;
}
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("applicationContext.xml")
public class ServiceDelegatorTest {
@Autowired
private ApplicationContext ac
@Test
public void testDelegator() {
MyServiceDelegator dg = ac.getBean(MyServiceDelegator.class);
ac.delegate("test");
}
}
ApplicationContext.xml:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="de.myapp.service" />
</beans>
问题:所有包含来自未在JUnit
测试中扫描的包(如MyCustomService
)的自动连线依赖项的服务都将引发异常:
原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:未找到依赖项得[SomeDao]类型得合格bean:需要至少一个具有此依赖项自动候选资格得bean.依赖关系批注:{@org.springframework.beans.factory.annotation.AutoWired(required=true)}(位于org.springframework.beans.factory.support.defaultlistablebeanfactory.raisenosuchbeandefinitionexception(defaultlistablebeanfactory.1103)(位于org.springframework.beans.factory.support.defaultlistablebeanfactory.doResolveDependency
问题是,somedao
没有通过组件扫描获得,因为它不在de.myapp.service
包下。
您已经明确声明了组件扫描的包是de.myapp.service
。
我建议你做以下改动:
这样de.myapp
下的所有代码都可以进行组件扫描。
如果希望避免在组件扫描中包含所有代码,可以执行以下操作:
<context:component-scan base-package="de.myapp.service, de.myapp.repository" />
您可以使用Springockito将模拟服务实现添加到您的测试应用程序上下文中。
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mockito="http://www.mockito.org/spring/mockito"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd"
http://www.mockito.org/spring/mockito
http://www.mockito.org/spring/mockito.xsd">
<context:component-scan base-package="de.myapp.service" />
<mockito:mock id="dao" class="de.myapp.repository.SomeDao" />
</beans>
我能够运行一个Rest Controller PUT方法,该方法通过Spring Boot Application使用预计的自动更新@Service。在尝试执行Spring JUnit测试时,相同的自动配线失败。我曾尝试阅读多个线程与类似的问题。我确保我没有通过“新”关键字创建@服务,我尝试了上下文配置和其他方法...但是一切似乎都是徒劳的。我不确定我哪里出错了。 我的Spring Boot应用程
我对从类扩展的Spring bean初始化有一个问题。我完全卡住了。 类hiearchy如下所示: 提到该类对需要初始化的服务很有用: 创建bean时: 则中的为null-似乎没有自动连线。 它能否与是从抽象类扩展而来的这一事实相联系? 这个bean可能从未初始化过... 这是个例外: org.springframework.beans.factory.UnsatisfiedDependencyE
我在服务类中的自动连线 Bean 上收到 。我尝试自动连线的类是Cassandra Repository。 我的主要类应用程序.java 我的Cassandra配置CassandraConfig.java 我的仓库(dao)产品价格仓库.java 我的服务类ProductService.java 我的pom.xml 我的理解是,注释应该拿起存储库并根据注释创建 bean。ProductServic
我定义了一个简单的类来保存我的elasticsearch客户端(称为ElasticClientConfig.java)的配置属性。 我为我的开发、生产和测试环境定义了一个配置。每个配置概要文件都有一个方法,该方法返回ElasticClientConfig类型的bean,并使用特定于环境的参数构建一个MyConfig对象。以下是开发版本: 我在我的网站中将我的活动配置文件设置为“dev”。xml文件
当我运行这个测试时,我会得到以下输出(如果我的服务不需要另一个bean,我会得到预期的输出) 由于这个响应,我在line.andExpect(content().contentType(Mediatype.application_json_utf8));上遇到了问题。当我检查response body时(因为body也是空的) 再现问题的示例项目在这里
我的配置类: BeanTest等级: BeanWebClient类: 我的用户类别: 最后,我的服务类: 我试图了解组件和自动布线依赖项在spring boot中是如何工作的。在我的User类中,autowired BeanTest类在配置过程中被初始化-执行所有必要的打印语句。但是,当我调用服务类的函数时,自动连线用户依赖项对于beanTest及其成员为null。与此相反,当我在我的用户类中创建