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

时间:2019-05-20 06:26:53

标签: spring-boot kotlin dependency-injection

假设我有以下课程:

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 个答案:

答案 0 :(得分:1)

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

另外,您的测试未使用Spring,就像使用 @RunWith(MockitoJUnitRunner :: class)注释一样。该跑步者可以初始化您的Mock对象,并将其注入测试对象(Javadoc)。

如果您想使用Spring来构造您的测试主题及其依赖项,则需要使用一组不同的注释(有关更多详细信息,请检查此tutorial

@RunWith(SpringRunner::class)
@SpringBootTest 
class FooTest {
   @Autowired
   lateinit var foo: Foo
}
相关问题