首页 文章

在将Spring Java8 Junit测试转换为Kotlin时摆脱lateinit

提问于
浏览
3

我正忙着将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(){

在Kotlin中重写它,它看起来像这样:

@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() {

而Junit抱怨道

java.lang.Exception:测试类应该在org.springframework.test.context.junit4.SpringJUnit4ClassRunner中有一个公共零参数构造函数 . (SpringJUnit4ClassRunner.java:104)at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)在sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)atg的java.lang.reflect.Constructor.newInstance(Constructor.java:423) . 在org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder)的org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21)中的junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29) . java:59)org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)at org.ju来自com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java)的org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:31)中的nit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26): 96)at com.intellij.jun.exe.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:42)at com.intellij.rt.exe.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:262)at com.intellij.rt.execution.junit .JUnitStarter.main(JUnitStarter.java:84)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java) :43)在com.intellij.rt.execution.application.AppMain.main的java.lang.reflect.Method.invoke(Method.java:498)中(AppMain.java:147)

有没有办法解决这个问题,还是我坚持 lateinit @Autowire

1 回答

  • 2

    如果spring组件要注入处理器,你应该注释构造函数,而不是构造函数参数:

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

    Bit Junit增加了对如何实现测试类的限制,并且不可能按照你想要的方式注入bean .

    PS . 从Spring 4.3开始,你不需要 @Autowired

    @Service
    class AccountTest(val ap: AccountProcessor) {
    

相关问题