如何自动装配服务,进而在 Junit 中自动装配另一个服务

Posted

技术标签:

【中文标题】如何自动装配服务,进而在 Junit 中自动装配另一个服务【英文标题】:How to autowire service which in turn autowires another service in Junit 【发布时间】:2020-09-08 13:04:57 【问题描述】:

TestSomething.class :

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations =  "application-context-junit" )
public class TestSomething 

      @Autowired
      ISomeService someService;
      ...// more code 


SomeServiceImpl.class :

@Service("someService")
public class SomeServiceImpl implements ISomeService
    @Autowired
    ISomeAnotherService someAnotherService;
    ..//more code

application-context-junit.xml:

<context:component-scan base-package="com.basepackage.*" />

所以,我的问题是 如果我在 application-context-junit.xml 中提供组件扫描来处理所有 Autowires 是否足够,或者我是否也应该在 xml 中添加以下内容?

<context:component-scan base-package="com.basepackage.*" />
<bean id="someService" class=""com.basepackage.SomeServiceImpl"" />
<bean id="someAnotherService" class=""com.basepackage.SomeAnotherServiceImpl"" />

【问题讨论】:

为什么要使用单独的配置进行测试,而不是使用现有的配置?如果服务被注释,您只需要组件扫描。但是,如果您只想测试服务(并且实际上并不需要 spring),那么只需创建一个服务实例并自己注入它们。 @M.Deinum 感谢您的回复。我创建了单独的配置只是为了理解。我要测试的服务中有很多自动连接。所以我这里需要春天 它应该只适用于组件扫描,前提是您的 ISomeAnotherService 的 impl 也被正确注释,例如与@Component@Service 或类似。一句忠告;避免使用大型测试上下文,因为这些会成为它们自己的维护负担,并且会很快变得复杂。我发现其他项目正在针对存根运行测试,并因此天真地通过了。 【参考方案1】:

每次使用字段注入时,单元测试都会死掉!

不要使用归档注入,因为这不是一个好习惯。此外,当 Spring 必须为每个测试注入类时,它会减慢测试速度。

正如您在 Article 中所读到的,最好使用构造函数或 setter 注入。

这种类型的注入可以很容易地模拟被测试组件使用的所有组件,如下所示:

import org.junit.Before;
import org.mockito.Mockito;

public class MyBeanTest 
    private MyBean target = new MyBean();
    private AnotherBean anotherBean = Mockito.mock(AnotherBean.class);

    @Before
    public void setUp() 
        myBean.setAnotherBean(anotherBean);
    

    //Tests...

【讨论】:

如果您需要集成测试而不是单元测试,您的方法将不起作用。此外,Spring 将在运行之间缓存上下文,因此只有在配置更改时(在编写集成测试时不应该经常发生),每个测试都不会发生注入。 @Sebastian 我有兴趣在没有 Mockito 的情况下这样做 @M.Deinum 你是对的,如果你想编写一个集成测试,你需要 Spring 框架来注入所有依赖项。但是我使用构造函数或 setter 注入的方法是正确的,因为通常您正在编写单元测试和集成测试。

以上是关于如何自动装配服务,进而在 Junit 中自动装配另一个服务的主要内容,如果未能解决你的问题,请参考以下文章

Spring 3 和 JUnit 4(自动装配)

获取在 Junit 中自动装配的 @ConfigurationProperties bean

在Camel JUnit中自动装配Spring Bean

Spring:在Junit中加载的类中自动装配不同的类

带有 JdbcTemplate 自动装配的 SimpleJdbcCall 的 Junit

从 JUnit 运行时 Spring 不会自动装配