当前位置: 首页 > 知识库问答 >
问题:

如何测试spring服务bean自身具有自动连线依赖?

太叔天宇
2023-03-14

我想测试一些包含其他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

共有2个答案

牛华皓
2023-03-14

问题是,somedao没有通过组件扫描获得,因为它不在de.myapp.service包下。

您已经明确声明了组件扫描的包是de.myapp.service

我建议你做以下改动:

这样de.myapp下的所有代码都可以进行组件扫描。

如果希望避免在组件扫描中包含所有代码,可以执行以下操作:

<context:component-scan base-package="de.myapp.service, de.myapp.repository" /> 
阎知
2023-03-14

您可以使用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。与此相反,当我在我的用户类中创建