我有一个SpringBoot项目,其中一半用Java编写,一半用Kotlin编写,为此我必须编写单元测试。目标之一是测试重要的@Service
类。我们称之为MyServiceToTest
,它具有以下定义:
@Service
class MyServiceToTest
@Autowired constructor(
private val myRepo : MyRepository, // repository
private val anotherRepo : AnotherRepository, // repository
private val beanToMock : BeanToMock, // component
private val serviceToMock : ServiceToMock // service
) {
// service stuff here
}
它还有另外2个Service
和2个Repository
作为@Autowired
。
然后,我想在测试类中Autowire
,同时模拟其内部自动装配服务(因为它们不会以任何方式影响逻辑),并将存储库作为真实bean注入(我已经建立了嵌入式H2数据库)。
这就是我的测试类的样子:
@DataJpaTest
@ExtendWith(SpringExtension::class)
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.H2, replace = AutoConfigureTestDatabase.Replace.ANY)
class TestMyService {
@TestConfiguration
internal class MyServiceTestConfiguration {
@Bean
fun beanToMock(): BeanToMock {
return Mockito.mock(BeanToMock::class.java)
}
@Bean
fun serviceToMock(): ServiceToMock {
return Mockito.mock(ServiceToMock::class.java)
}
@Autowired private lateinit var myRepo: MyRepository
@Autowired private lateinit var anotherRepo: AnotherRepository
@Bean
fun myServiceToTest(): MyServiceToTest{
return MyServiceToTest(
myRepo,
anotherRepo,
beanToMock(),
serviceToMock())
}
}
@Autowired
private lateinit var myService: MyServiceToTest
@Test
fun test1() {
// test goes here
}
}
但是,当我启动测试myService
内部的所有字段(存储库,服务等)均为null
时,注入似乎失败了。我还尝试过自动装配模拟bean而不是使用构造函数调用中的方法,结果是相同的。