Kotlin:在单元测试中自动布线服务层类的正确方法

时间:2019-05-30 13:36:38

标签: spring unit-testing spring-boot kotlin junit

我有一个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而不是使用构造函数调用中的方法,结果是相同的。

0 个答案:

没有答案