You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试报错:lateinit属性fakeAuthRepository未初始化问题求助

解决单元测试中lateinit变量未初始化异常

问题现象

运行单元测试时抛出以下异常:

lateinit property fakeAuthRepository has not been initialized
kotlin.UninitializedPropertyAccessException: lateinit property fakeAuthRepository has not been initialized

触发异常的测试代码:

internal class SignInViewModelTest{
    private val _login =  MutableStateFlow<UiStateObject<SignInResponse>>(UiStateObject.EMPTY)

    @Mock
    lateinit var backendApi:BackendApi

    lateinit var fakeAuthRepository: FakeAuthRepository
    lateinit var authRepository: AuthRepository
    private lateinit var viewModel: SignInViewModel
    
    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        fakeAuthRepository = FakeAuthRepository(backendApi)
        authRepository = AuthRepository(backendApi)
        viewModel = SignInViewModel(authRepository)
    }

    var login = _login

    @Test
    fun `testing repository`() = runBlockingTest {
        val fake = fakeAuthRepository.login("kyodgorbek@gmail.com", "12345678", "android", "123455")
        val real = authRepository.login("kyodgorbek@gmail.com", "12345678", "android", "123455")
        assertEquals(fake, real)
    }
}

解决方法

1. 匹配JUnit版本与注解

如果你的测试环境用的是JUnit 5(Jupiter),原代码中的@Before是JUnit 4的注解,不会被执行,导致setUp方法没运行,fakeAuthRepository未初始化。需要做两处修改:

  • 将@Before替换为JUnit 5的@BeforeEach
  • 在测试类顶部添加@ExtendWith(MockitoExtension::class),替代MockitoAnnotations.initMocks(this)来初始化Mock对象

修改后的代码:

import org.junit.jupiter.api.BeforeEach
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
import org.mockito.Mock
import org.mockito.junit.jupiter.MockitoExtension

@ExtendWith(MockitoExtension::class)
internal class SignInViewModelTest{
    private val _login =  MutableStateFlow<UiStateObject<SignInResponse>>(UiStateObject.EMPTY)

    @Mock
    lateinit var backendApi:BackendApi

    lateinit var fakeAuthRepository: FakeAuthRepository
    lateinit var authRepository: AuthRepository
    private lateinit var viewModel: SignInViewModel
    
    @BeforeEach
    fun setUp() {
        fakeAuthRepository = FakeAuthRepository(backendApi)
        authRepository = AuthRepository(backendApi)
        viewModel = SignInViewModel(authRepository)
    }

    var login = _login

    @Test
    fun `testing repository`() = runBlockingTest {
        val fake = fakeAuthRepository.login("kyodgorbek@gmail.com", "12345678", "android", "123455")
        val real = authRepository.login("kyodgorbek@gmail.com", "12345678", "android", "123455")
        assertEquals(fake, real)
    }
}

2. 若使用JUnit 4,确保注解和依赖正确

如果坚持用JUnit 4,要保证:

  • @Before注解来自org.junit.Before而非JUnit 5包
  • MockitoAnnotations.initMocks(this)放在setUp方法的第一行,确保backendApi先被初始化,再用来创建fakeAuthRepository

3. 检查IDE测试运行配置

部分IDE可能默认用JUnit 5运行JUnit 4测试,导致注解失效。需在测试运行配置中指定使用JUnit 4运行该测试类。

内容的提问来源于stack exchange,提问作者Edgar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 23:50:44