У меня есть проект 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
, так что кажетсяэта инъекция не удалась.Я также попытался использовать автоматическую разводку фиктивных бинов вместо использования методов внутри вызова конструктора, результат был тот же.