Kotlin – lateinit TestRestTemplate不能初始化集成测试

我使用kotlin开发了一个spring-boot应用程序 – 总体情况进展顺利。 (spring 1.5.6.RELEASE,kotlin 1.1.4-3)

无论如何,我在回顾一些示例代码之后添加了我的第一个控制器测试,并且遇到了这个恼人的错误:

kotlin.UninitializedPropertyAccessException:lateinit属性restTemplate尚未初始化

kotlin.UninitializedPropertyAccessException:lateinit属性testRestTemplate尚未初始化

at com.thingy.controllers.ProductSetControllerTest.getTestRestTemplate(ProductSetControllerTest.kt:16) at com.thingy.controllers.ProductSetControllerTest.testGet(ProductSetControllerTest.kt:20) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:80) at org.testng.internal.Invoker.invokeMethod(Invoker.java:714) at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:901) at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1231) at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:127) at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:111) at org.testng.TestRunner.privateRun(TestRunner.java:767) at org.testng.TestRunner.run(TestRunner.java:617) at org.testng.SuiteRunner.runTest(SuiteRunner.java:334) at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:329) at org.testng.SuiteRunner.privateRun(SuiteRunner.java:291) at org.testng.SuiteRunner.run(SuiteRunner.java:240) at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52) at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86) at org.testng.TestNG.runSuitesSequentially(TestNG.java:1198) at org.testng.TestNG.runSuitesLocally(TestNG.java:1123) at org.testng.TestNG.run(TestNG.java:1031) at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72) at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123) 

这是测试类

 import org.junit.runner.RunWith import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.boot.test.web.client.TestRestTemplate import org.springframework.test.context.junit4.SpringRunner import org.testng.Assert import org.testng.annotations.Test @RunWith(SpringRunner::class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) class ProductSetControllerTest { @Autowired lateinit var restTemplate: TestRestTemplate @Test fun testGet() { val forObject = restTemplate.getForObject("/", String::class.java) Assert.assertEquals(forObject, "gettest") } } 

一些我试过的东西: – 确保我没有使用弃用的TestRestTemplate – 尝试使用setter注入而不是现场注入,但是浪费时间。 – 禁用kotlin编译器插件

Spring Boot不会自动实例化TestRestTemplate bean(duh!)。

你需要自己定义它,然后你就可以使用它。

 @Bean open fun restTemplate(): TestRestTemplate { return TestRestTemplate() }