我正忙着将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 回答
如果spring组件要注入处理器,你应该注释构造函数,而不是构造函数参数:
Bit Junit增加了对如何实现测试类的限制,并且不可能按照你想要的方式注入bean .
PS . 从Spring 4.3开始,你不需要
@Autowired
: