Kotlin嵌套类无法访问外部类变量问题求助
解决Kotlin中@Nested测试类访问外部类变量的问题
问题原因
Kotlin的嵌套类默认是静态嵌套类(等价于Java的static class),这类类不持有外部类的实例引用,因此无法访问外部类的非静态成员(比如你定义的mockFoo)。而Java的嵌套类默认是非静态内部类,所以能直接访问外部类成员,这是Kotlin和Java的核心差异点,也是你报错的根本原因。
解决方案
给你的XyzTest嵌套类加上inner关键字,将其改为内部类,这样它会持有外部类GetBazTest的实例引用,就能正常访问mockFoo等外部类成员了:
@ExtendWith(MockKExtension::class) class GetBazTest { @MockK private lateinit var mockFoo: FooClient @MockK private lateinit var mockBar: BarClient private lateinit var getBaz: GetBaz @BeforeEach fun setup() { getBaz = GetBaz( mockFoo, mockBar, ) } @Test fun `it should do a thing`() { // some code to create expectedResult coEvery { mockFoo.getSomething(any()) } answers { expectedResult } } @Nested @DisplayName("Tests for Xyz") inner class XyzTest { // 新增inner关键字 @Test fun `it should do a different thing`() { // some code to create expectedResult coEvery { mockFoo.getAThing(any()) // 现在可正常访问,不再报错 } answers { expectedResult } } } }
补充说明
- JUnit 5完全支持
inner类型的@Nested测试类,测试框架会自动创建外部类实例,再初始化内部类实例,确保内部类能访问外部类的成员变量。 - 不推荐将
mockFoo放到companion object中(静态成员),因为静态变量会在所有测试用例间共享状态,容易导致测试污染,破坏用例独立性。
内容的提问来源于stack exchange,提问作者TheRealFakeNews
相关产品推荐
相关产品推荐

