如何在单元测试中从依赖注入容器中获取实例?

Posted

技术标签:

【中文标题】如何在单元测试中从依赖注入容器中获取实例?【英文标题】:How to get instances from dependency-injection container in unit tests? 【发布时间】:2019-10-06 11:51:53 【问题描述】:

假设我有以下课程:

import com.fasterxml.jackson.databind.ObjectMapper

class Foo(private val jsonMapper: ObjectMapper) 
    // ...

以及相应的测试:

import com.fasterxml.jackson.databind.ObjectMapper

@RunWith(MockitoJUnitRunner::class)
class FooTest 

    private val jsonMapper = ObjectMapper().findAndRegisterModules()

    private lateinit var foo: Foo

    @Before
    fun makeFoo() 
        foo = Foo(jsonMapper)
    

我的问题是我必须手动致电findAndRegisterModules(以获得jsr310 支持等)。我更愿意让 Spring Boot 决定如何构建我的依赖项。

但是由于java.lang.Exception: Test class should have exactly one public zero-argument constructor,以下失败:

import com.fasterxml.jackson.databind.ObjectMapper

@RunWith(MockitoJUnitRunner::class)
class FooTest(private val jsonMapper: ObjectMapper) 

    private val foo = Foo(jsonMapper)

那么,处理这种情况的正确方法是什么?

【问题讨论】:

【参考方案1】:

您的测试失败,因为 JUnit4 测试需要有一个无参数的构造函数。

您的测试也没有使用 Spring,因为您使用的是 @RunWith(MockitoJUnitRunner::class) 注释。此运行程序允许初始化您的 Mock 对象并将它们注入您的测试对象 (Javadoc)。

如果您想使用 Spring 构建您的测试主题及其依赖项,您需要使用一组不同的注释(查看此tutorial 了解更多详细信息):

@RunWith(SpringRunner::class)
@SpringBootTest 
class FooTest 
   @Autowired
   lateinit var foo: Foo

【讨论】:

以上是关于如何在单元测试中从依赖注入容器中获取实例?的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot-单元测试

如何调整我的视图模型以实现依赖注入 swiftui(用于以后的单元测试)

如何使用构造函数依赖注入对 asp.net 核心应用程序进行单元测试

c#依赖注入和控制反转的书籍

如何对具有依赖项的工厂进行单元测试

单元测试怎么注入service