@Mockで、lateinit property ??? has not been initialized

エラーの状況

次のようにテストケースを写経していました。

@RunWith(MockitoJUnitRunner::class) class MockAnnotationWheneverTest { @Mock private lateinit var accountRepository : AccountRepository @InjectMocks private lateinit var accountService : AccountServiceImpl @Test fun fuga() { whenever(accountRepository.findById(1)) .thenReturn(Account("Alice")) assertEquals( "Alice", accountService.findById(1).name) } }
Code language: Kotlin (kotlin)

テストを実行したところ、テスト失敗です。

lateinit property accountRepository has not been initialized kotlin.UninitializedPropertyAccessException: lateinit property accountRepository has not been initialized
Code language: plaintext (plaintext)

@Mockをつけた accountRepository のインスタンスが生成されていないよ、とのことです。

mockit-kotlinのバージョンは、2.2.0 です。

// build.gradle.kts testImplementation("junit:junit:4.12") testImplementation("io.kotlintest:kotlintest-runner-junit4:3.4.2") testImplementation("com.nhaarman.mockitokotlin2:mockito-kotlin:2.2.0")
Code language: plaintext (plaintext)

解決方法

stackoverflow先生によると、@BeforeEachで、次のように書くといいそうです。

@BeforeEach fun setUp() { MockitoAnnotations.openMocks(this) }
Code language: Kotlin (kotlin)

全体を示すと、

@RunWith(MockitoJUnitRunner::class) class MockAnnotationWheneverTest { @Mock private lateinit var accountRepository : AccountRepository @InjectMocks private lateinit var accountService : AccountServiceImpl @BeforeEach fun setUp() { MockitoAnnotations.openMocks(this) } @Test fun fuga() { whenever(accountRepository.findById(1)) .thenReturn(Account("Alice2")) assertEquals( "Alice2", accountService.findById(1).name) } }
Code language: Kotlin (kotlin)

stackoverflowやqiitaのお世話になりっぱなしだね!

lateinit property mock object has not been initialized
I'm trying to initialize (by mocking) two objects with the annotation @MockBean It seems only to work if i call the method mock(className), but since i want to...
タイトルとURLをコピーしました