如何在单元测试中从依赖注入容器中获取实例?
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
【讨论】:
以上是关于如何在单元测试中从依赖注入容器中获取实例?的主要内容,如果未能解决你的问题,请参考以下文章
如何调整我的视图模型以实现依赖注入 swiftui(用于以后的单元测试)