Intereting Posts

Избавление от lateinit при конвертации Spring Java8 Junit test в Kotlin

Я занят преобразованием тестов Java8 Junit в Kotlin

Java8:

@ActiveProfiles("junit") @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration({"classpath*:META-INF/spring/applicationContext.xml"}) public class AuctionTest { @Autowired AccountProcessor ap; @Test @Rollback public void securityTest(){ 

Переписывая его в Котлин, он выглядит так:

 @ActiveProfiles("junit") @RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration("classpath*:META-INF/spring/applicationContext.xml") class AccountTest() { @Autowired lateinit var ap: AccountProcessor @Test @Rollback fun securityTest() { к @ActiveProfiles("junit") @RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration("classpath*:META-INF/spring/applicationContext.xml") class AccountTest() { @Autowired lateinit var ap: AccountProcessor @Test @Rollback fun securityTest() { 

Вышеупомянутый модульный тест работает нормально, но я хочу избавиться от lateinit

Переписывая это так:

 @ActiveProfiles("junit") @RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration("classpath*:META-INF/spring/applicationContext.xml") class AccountTest(@Autowired val ap: AccountProcessor) { @Test @Rollback fun securityTest() { к @ActiveProfiles("junit") @RunWith(SpringJUnit4ClassRunner::class) @ContextConfiguration("classpath*:META-INF/spring/applicationContext.xml") class AccountTest(@Autowired val ap: AccountProcessor) { @Test @Rollback fun securityTest() { 

И Джунит жалуется

java.lang.Exception: класс Test должен иметь ровно один открытый конструктор с нулевым аргументом

на org.springframework.test.context.junit4.SpringJUnit4ClassRunner. (SpringJUnit4ClassRunner.java:104) на sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) на sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) на солнце. отражать.ДелегацияConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance (Constructor.java:423) в org.junit.internal.builders.AnnotatedBuilder.buildRunner (AnnotatedBuilder.java:29) в org .junit.internal.builders.AnnotatedBuilder.runnerForClass (AnnotatedBuilder.java21) на org.junit.runners.model.RunnerBuilder.safeRunnerForClass (RunnerBuilder.java:59) на org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass (AllDefaultPossibilitiesBuilder .java: 26) на org.junit.runners.model.RunnerBuilder.safeRunnerForClass (RunnerBuilder.java:59) на org.junit.internal.requests.ClassRequest.getRunner (ClassRequest.java:26) на org.junit.internal. ре quests.FilterRequest.getRunner (FilterRequest.java:31) на com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:96) на com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs (JUnit4IdeaTestRunner.java:42) на com.intellij .rt.execution.junit.JUnitStarter.prepareStreamsAndStart (JUnitStarter.java:262) в com.intellij.rt.execution.junit.JUnitStarter.main (JUnitStarter.java:84) на sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) на sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) на sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke (Method.java:498) в com. intellij.rt.execution.application.AppMain.main (AppMain.java:147)

Есть ли способ обойти это или я застрял с lateinit @Autowire ?

В случае весеннего компонента для ввода процессора вы должны аннотировать конструктор, а не аргумент конструктора:

 @Service class AccountTest @Autowired constructor(val ap: AccountProcessor) { } 

Бит Junit добавляет свои ограничения на то, как должны быть реализованы тестовые классы, и вы не можете запрограммировать bean-компонент.

пс. С весны 4.3 вам не нужно @Autowired :

 @Service class AccountTest(val ap: AccountProcessor) {