Kotlin: правильный путь к классу сервисных слоев Autowire в модульном тестировании - PullRequest
0 голосов
/ 30 мая 2019

У меня есть проект 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 это в моем тестовом классе, при этом издеваясь над внутренними автоматически связанными сервисами (поскольку они никак не влияют на логику) и внедряя репозитории в виде реальных компонентов (я настроил встроенную базу данных 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
    }
}

Но когда я запускаю test, все поля внутри myService (хранилища, службы и т. Д.) Равны null, так что кажетсяэта инъекция не удалась.Я также попытался использовать автоматическую разводку фиктивных бинов вместо использования методов внутри вызова конструктора, результат был тот же.

...