单元测试报错: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
相关产品推荐
相关产品推荐

