Fix code analysis errors

With that updated Mockito, so `verifyZeroInteractions` is now `verifyNoInteractions`
This commit is contained in:
Gergely Hegedus 2022-04-13 19:31:42 +03:00
parent 1d2ca90203
commit 58a76a3d28
18 changed files with 71 additions and 69 deletions

View file

@ -24,8 +24,10 @@ object TestDatabaseInitialization {
} }
fun overwriteDatabaseInitialization(dispatcher: CoroutineDispatcher) { fun overwriteDatabaseInitialization(dispatcher: CoroutineDispatcher) {
loadKoinModules(module { loadKoinModules(
single { create(androidContext(), dispatcher) } module {
}) single { create(androidContext(), dispatcher) }
}
)
} }
} }

View file

@ -24,8 +24,8 @@ import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -150,7 +150,7 @@ internal class MainViewModelTest {
sut.onRefresh() sut.onRefresh()
testScheduler.advanceUntilIdle() testScheduler.advanceUntilIdle()
verifyZeroInteractions(mockFetchContentUseCase) verifyNoInteractions(mockFetchContentUseCase)
} }
@DisplayName("GIVEN non loading viewModel WHEN refreshing THEN usecase is called") @DisplayName("GIVEN non loading viewModel WHEN refreshing THEN usecase is called")
@ -209,8 +209,8 @@ internal class MainViewModelTest {
sut.onFavouriteToggleClicked(ContentId("c")) sut.onFavouriteToggleClicked(ContentId("c"))
testScheduler.advanceUntilIdle() testScheduler.advanceUntilIdle()
verifyZeroInteractions(mockRemoveContentFromFavouritesUseCase) verifyNoInteractions(mockRemoveContentFromFavouritesUseCase)
verifyZeroInteractions(mockAddContentToFavouriteUseCase) verifyNoInteractions(mockAddContentToFavouriteUseCase)
} }
@DisplayName("GIVEN success content list viewModel WHEN toggling a favourite contentId THEN remove favourite usecase is called") @DisplayName("GIVEN success content list viewModel WHEN toggling a favourite contentId THEN remove favourite usecase is called")
@ -229,7 +229,7 @@ internal class MainViewModelTest {
runBlocking { verify(mockRemoveContentFromFavouritesUseCase, times(1)).invoke(ContentId("b")) } runBlocking { verify(mockRemoveContentFromFavouritesUseCase, times(1)).invoke(ContentId("b")) }
verifyNoMoreInteractions(mockRemoveContentFromFavouritesUseCase) verifyNoMoreInteractions(mockRemoveContentFromFavouritesUseCase)
verifyZeroInteractions(mockAddContentToFavouriteUseCase) verifyNoInteractions(mockAddContentToFavouriteUseCase)
} }
@DisplayName("GIVEN success content list viewModel WHEN toggling a not favourite contentId THEN add favourite usecase is called") @DisplayName("GIVEN success content list viewModel WHEN toggling a not favourite contentId THEN add favourite usecase is called")
@ -246,7 +246,7 @@ internal class MainViewModelTest {
sut.onFavouriteToggleClicked(ContentId("a")) sut.onFavouriteToggleClicked(ContentId("a"))
testScheduler.advanceUntilIdle() testScheduler.advanceUntilIdle()
verifyZeroInteractions(mockRemoveContentFromFavouritesUseCase) verifyNoInteractions(mockRemoveContentFromFavouritesUseCase)
runBlocking { verify(mockAddContentToFavouriteUseCase, times(1)).invoke(ContentId("a")) } runBlocking { verify(mockAddContentToFavouriteUseCase, times(1)).invoke(ContentId("a")) }
verifyNoMoreInteractions(mockAddContentToFavouriteUseCase) verifyNoMoreInteractions(mockAddContentToFavouriteUseCase)
} }

View file

@ -162,7 +162,7 @@ fun withoutSessionTheUserIsNotLoggedIn() = runTest {
val actual = isUserLoggedInUseCase.invoke() val actual = isUserLoggedInUseCase.invoke()
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
``` ```
@ -187,7 +187,7 @@ And just verify:
Assertions.assertEquals(Answer.Success(LoginStatus.SUCCESS), answer) Assertions.assertEquals(Answer.Success(LoginStatus.SUCCESS), answer)
Assertions.assertTrue(actual, "User is expected to be logged in") Assertions.assertTrue(actual, "User is expected to be logged in")
Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session) Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
``` ```
With this, looks like our Integration works correctly. Requests are called, proper response is received, login state is changed. With this, looks like our Integration works correctly. Requests are called, proper response is received, login state is changed.
@ -214,7 +214,7 @@ And do our verifications, aka not logged in, not session expired and the correct
Assertions.assertEquals(Answer.Success(loginError), answer) Assertions.assertEquals(Answer.Success(loginError), answer)
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
``` ```
Now we just need to declare our parameters for our test: Now we just need to declare our parameters for our test:
@ -247,7 +247,7 @@ fun networkInputError(authScenario: AuthScenario) = runTest {
Assertions.assertTrue(answer is Answer.Error, "Answer is expected to be an Error") Assertions.assertTrue(answer is Answer.Error, "Answer is expected to be an Error")
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
//... //...
@ -282,7 +282,7 @@ fun loginInvalidCredentials() = runTest {
Assertions.assertEquals(Answer.Success(LoginStatus.INVALID_CREDENTIALS), answer) Assertions.assertEquals(Answer.Success(LoginStatus.INVALID_CREDENTIALS), answer)
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
``` ```
@ -305,7 +305,7 @@ And we verify the user is indeed logged out now:
```kotlin ```kotlin
Assertions.assertFalse(actual, "User is expected to be logged out") Assertions.assertFalse(actual, "User is expected to be logged out")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
``` ```
### 7. `logoutReleasesContent` ### 7. `logoutReleasesContent`

View file

@ -56,7 +56,7 @@ When the class is created, the delegate should not yet be touched, so we start t
@DisplayName("WHEN nothing is changed THEN delegate is not touched") // this will show up when running our tests and is a great way to document what we are testing @DisplayName("WHEN nothing is changed THEN delegate is not touched") // this will show up when running our tests and is a great way to document what we are testing
@Test // this defines that this method is a test, needs to be org.junit.jupiter.api.Test @Test // this defines that this method is a test, needs to be org.junit.jupiter.api.Test
fun verifyNoInteractionsIfNoInvocations() { fun verifyNoInteractionsIfNoInvocations() {
verifyZeroInteractions(mockSessionExpirationListener) // we verify that our mock object's functions / properties have not been touched verifyNoInteractions(mockSessionExpirationListener) // we verify that our mock object's functions / properties have not been touched
} }
``` ```
@ -131,8 +131,8 @@ Lastly we add verification:
```kotlin ```kotlin
Assertions.assertEquals(expected, actual) // assert the result is what we expected Assertions.assertEquals(expected, actual) // assert the result is what we expected
verifyZeroInteractions(mockLoginRemoteSource) // assert no request was called verifyNoInteractions(mockLoginRemoteSource) // assert no request was called
verifyZeroInteractions(mockUserDataLocalStorage) // assert we didn't modify our storage verifyNoInteractions(mockUserDataLocalStorage) // assert we didn't modify our storage
``` ```
But something is wrong, the invoke method cannot be executed since it's a suspending function. But something is wrong, the invoke method cannot be executed since it's a suspending function.
@ -148,8 +148,8 @@ fun emptyUserNameReturnsLoginStatusError() = runTest {
val actual = sut.invoke(LoginCredentials("", "a")) val actual = sut.invoke(LoginCredentials("", "a"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockLoginRemoteSource) verifyNoInteractions(mockLoginRemoteSource)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
``` ```
@ -172,8 +172,8 @@ fun emptyPasswordNameReturnsLoginStatusError() = runTest {
val actual = sut.invoke(LoginCredentials("a", "")) val actual = sut.invoke(LoginCredentials("a", ""))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockLoginRemoteSource) verifyNoInteractions(mockLoginRemoteSource)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
``` ```
@ -211,7 +211,7 @@ And finally verification:
```kotlin ```kotlin
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
``` ```
Together: Together:
@ -226,7 +226,7 @@ fun invalidLoginResponseReturnInvalidCredentials() = runTest {
val actual = sut.invoke(LoginCredentials("a", "b")) val actual = sut.invoke(LoginCredentials("a", "b"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
``` ```
@ -291,7 +291,7 @@ Verification:
```kotlin ```kotlin
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
``` ```
Together: Together:
@ -308,7 +308,7 @@ fun invalidResponseResultsInErrorReturned() = runTest {
val actual = sut.invoke(LoginCredentials("a", "b")) val actual = sut.invoke(LoginCredentials("a", "b"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
``` ```
#### Lessons learned #### Lessons learned

View file

@ -328,7 +328,7 @@ Assertions.assertEquals("login-access", contentRequestAfterRefreshed.getHeader("
// this matches the data from the success_response_login.json // this matches the data from the success_response_login.json
val expectedSavedSession = Session(accessToken = "login-access", refreshToken = "login-refresh") val expectedSavedSession = Session(accessToken = "login-access", refreshToken = "login-refresh")
verify(mockNetworkSessionLocalStorage, times(1)).session = expectedSavedSession verify(mockNetworkSessionLocalStorage, times(1)).session = expectedSavedSession
verifyZeroInteractions(mockNetworkSessionExpirationListener) verifyNoInteractions(mockNetworkSessionExpirationListener)
``` ```
### 2. `failingRefreshResultsInSessionExpiration` ### 2. `failingRefreshResultsInSessionExpiration`

View file

@ -13,8 +13,8 @@ import org.mockito.kotlin.doThrow
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -33,7 +33,7 @@ internal class AddContentToFavouriteUseCaseTest {
@DisplayName("WHEN nothing happens THEN the storage is not touched") @DisplayName("WHEN nothing happens THEN the storage is not touched")
@Test @Test
fun initializationDoesntAffectStorage() { fun initializationDoesntAffectStorage() {
verifyZeroInteractions(mockFavouriteContentLocalStorage) verifyNoInteractions(mockFavouriteContentLocalStorage)
} }
@DisplayName("GIVEN contentId WHEN called THEN storage is called") @DisplayName("GIVEN contentId WHEN called THEN storage is called")

View file

@ -11,8 +11,8 @@ import org.mockito.kotlin.doThrow
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -31,7 +31,7 @@ internal class FetchContentUseCaseTest {
@DisplayName("WHEN nothing happens THEN the storage is not touched") @DisplayName("WHEN nothing happens THEN the storage is not touched")
@Test @Test
fun initializationDoesntAffectRepository() { fun initializationDoesntAffectRepository() {
verifyZeroInteractions(mockContentRepository) verifyNoInteractions(mockContentRepository)
} }
@DisplayName("WHEN called THEN repository is called") @DisplayName("WHEN called THEN repository is called")

View file

@ -13,8 +13,8 @@ import org.mockito.kotlin.doThrow
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -33,7 +33,7 @@ internal class RemoveContentFromFavouritesUseCaseTest {
@DisplayName("WHEN nothing happens THEN the storage is not touched") @DisplayName("WHEN nothing happens THEN the storage is not touched")
@Test @Test
fun initializationDoesntAffectStorage() { fun initializationDoesntAffectStorage() {
verifyZeroInteractions(mockFavouriteContentLocalStorage) verifyNoInteractions(mockFavouriteContentLocalStorage)
} }
@DisplayName("GIVEN contentId WHEN called THEN storage is called") @DisplayName("GIVEN contentId WHEN called THEN storage is called")

View file

@ -38,7 +38,7 @@ import org.koin.test.KoinTest
import org.koin.test.get import org.koin.test.get
import org.koin.test.inject import org.koin.test.inject
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.verifyZeroInteractions import org.mockito.kotlin.verifyNoInteractions
import java.util.stream.Stream import java.util.stream.Stream
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
@ -86,7 +86,7 @@ class AuthIntegrationTest : KoinTest {
val actual = isUserLoggedInUseCase.invoke() val actual = isUserLoggedInUseCase.invoke()
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@DisplayName("GIVEN no session WHEN user is logging in THEN they get session") @DisplayName("GIVEN no session WHEN user is logging in THEN they get session")
@ -101,7 +101,7 @@ class AuthIntegrationTest : KoinTest {
Assertions.assertEquals(Answer.Success(LoginStatus.SUCCESS), answer) Assertions.assertEquals(Answer.Success(LoginStatus.SUCCESS), answer)
Assertions.assertTrue(actual, "User is expected to be logged in") Assertions.assertTrue(actual, "User is expected to be logged in")
Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session) Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@MethodSource("localInputErrorArguments") @MethodSource("localInputErrorArguments")
@ -113,7 +113,7 @@ class AuthIntegrationTest : KoinTest {
Assertions.assertEquals(Answer.Success(loginError), answer) Assertions.assertEquals(Answer.Success(loginError), answer)
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@MethodSource("networkErrorArguments") @MethodSource("networkErrorArguments")
@ -127,7 +127,7 @@ class AuthIntegrationTest : KoinTest {
Assertions.assertTrue(answer is Answer.Error, "Answer is expected to be an Error") Assertions.assertTrue(answer is Answer.Error, "Answer is expected to be an Error")
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@DisplayName("GIVEN invalid credentials response WHEN user is logging in THEN they get proper error") @DisplayName("GIVEN invalid credentials response WHEN user is logging in THEN they get proper error")
@ -141,7 +141,7 @@ class AuthIntegrationTest : KoinTest {
Assertions.assertEquals(Answer.Success(LoginStatus.INVALID_CREDENTIALS), answer) Assertions.assertEquals(Answer.Success(LoginStatus.INVALID_CREDENTIALS), answer)
Assertions.assertFalse(actual, "User is expected to be not logged in") Assertions.assertFalse(actual, "User is expected to be not logged in")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@DisplayName("GIVEN logged in user WHEN user is logging out THEN they no longer have a session") @DisplayName("GIVEN logged in user WHEN user is logging out THEN they no longer have a session")
@ -155,7 +155,7 @@ class AuthIntegrationTest : KoinTest {
Assertions.assertFalse(actual, "User is expected to be logged out") Assertions.assertFalse(actual, "User is expected to be logged out")
Assertions.assertEquals(null, fakeUserDataLocalStorage.session) Assertions.assertEquals(null, fakeUserDataLocalStorage.session)
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@DisplayName("GIVEN logged in user WHEN user is logging out THEN content is cleared") @DisplayName("GIVEN logged in user WHEN user is logging out THEN content is cleared")

View file

@ -38,7 +38,7 @@ import org.koin.core.context.stopKoin
import org.koin.test.KoinTest import org.koin.test.KoinTest
import org.koin.test.inject import org.koin.test.inject
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.verifyZeroInteractions import org.mockito.kotlin.verifyNoInteractions
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
class ContentIntegrationTest : KoinTest { class ContentIntegrationTest : KoinTest {
@ -97,7 +97,7 @@ class ContentIntegrationTest : KoinTest {
} }
Assertions.assertEquals(expected, actual.await()) Assertions.assertEquals(expected, actual.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -120,7 +120,7 @@ class ContentIntegrationTest : KoinTest {
} }
Assertions.assertEquals(expected, actual.await()) Assertions.assertEquals(expected, actual.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -150,7 +150,7 @@ class ContentIntegrationTest : KoinTest {
} }
Assertions.assertEquals(expected, actual.await()) Assertions.assertEquals(expected, actual.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -201,7 +201,7 @@ class ContentIntegrationTest : KoinTest {
Assertions.assertIterableEquals(expected, actual.await()) Assertions.assertIterableEquals(expected, actual.await())
Assertions.assertEquals(expected.last(), verifyCaching.await()) Assertions.assertEquals(expected.last(), verifyCaching.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -229,7 +229,7 @@ class ContentIntegrationTest : KoinTest {
} }
Assertions.assertIterableEquals(expected, actual.await()) Assertions.assertIterableEquals(expected, actual.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -268,7 +268,7 @@ class ContentIntegrationTest : KoinTest {
Assertions.assertTrue((actualValues[1] as Resource.Error).error is NetworkException, "Resource is Network Error") Assertions.assertTrue((actualValues[1] as Resource.Error).error is NetworkException, "Resource is Network Error")
Assertions.assertEquals(expected[2], actualValues[2]) Assertions.assertEquals(expected[2], actualValues[2])
Assertions.assertEquals(expected[3], actualValues[3]) Assertions.assertEquals(expected[3], actualValues[3])
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
Assertions.assertSame(session, fakeUserDataLocalStorage.session) Assertions.assertSame(session, fakeUserDataLocalStorage.session)
} }
@ -331,7 +331,7 @@ class ContentIntegrationTest : KoinTest {
} }
Assertions.assertIterableEquals(expected, actual.await()) Assertions.assertIterableEquals(expected, actual.await())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
val expectedSession = Session(accessToken = "refreshed-access", refreshToken = "refreshed-refresh") val expectedSession = Session(accessToken = "refreshed-access", refreshToken = "refreshed-refresh")
Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session) Assertions.assertEquals(expectedSession, fakeUserDataLocalStorage.session)
} }

View file

@ -34,8 +34,8 @@ import org.koin.test.inject
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
class SessionExpirationIntegrationTest : KoinTest { class SessionExpirationIntegrationTest : KoinTest {
@ -82,7 +82,7 @@ class SessionExpirationIntegrationTest : KoinTest {
mockServerScenarioSetup.setScenario(AuthScenario.Success(username = "a", password = "b"), validateArguments = true) mockServerScenarioSetup.setScenario(AuthScenario.Success(username = "a", password = "b"), validateArguments = true)
loginUseCase.invoke(LoginCredentials(username = "a", password = "b")) loginUseCase.invoke(LoginCredentials(username = "a", password = "b"))
Assertions.assertTrue(isUserLoggedInUseCase.invoke()) Assertions.assertTrue(isUserLoggedInUseCase.invoke())
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
mockServerScenarioSetup.setScenario(ContentScenario.Unauthorized(usingRefreshedToken = false)) mockServerScenarioSetup.setScenario(ContentScenario.Unauthorized(usingRefreshedToken = false))
.setScenario(RefreshTokenScenario.Error) .setScenario(RefreshTokenScenario.Error)

View file

@ -8,7 +8,7 @@ import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.kotlin.doReturn import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.verifyZeroInteractions import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -26,7 +26,7 @@ internal class IsUserLoggedInUseCaseTest {
@DisplayName("WHEN nothing is called THEN storage is not called") @DisplayName("WHEN nothing is called THEN storage is not called")
@Test @Test
fun creatingDoesntAffectStorage() { fun creatingDoesntAffectStorage() {
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
@DisplayName("GIVEN session data saved WHEN is user logged in checked THEN true is returned") @DisplayName("GIVEN session data saved WHEN is user logged in checked THEN true is returned")

View file

@ -19,8 +19,8 @@ import org.mockito.kotlin.doThrow
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@ -46,8 +46,8 @@ internal class LoginUseCaseTest {
val actual = sut.invoke(LoginCredentials("", "a")) val actual = sut.invoke(LoginCredentials("", "a"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockLoginRemoteSource) verifyNoInteractions(mockLoginRemoteSource)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
@DisplayName("GIVEN empty password WHEN trying to login THEN invalid password is returned") @DisplayName("GIVEN empty password WHEN trying to login THEN invalid password is returned")
@ -58,8 +58,8 @@ internal class LoginUseCaseTest {
val actual = sut.invoke(LoginCredentials("a", "")) val actual = sut.invoke(LoginCredentials("a", ""))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockLoginRemoteSource) verifyNoInteractions(mockLoginRemoteSource)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
@DisplayName("GIVEN invalid credentials response WHEN trying to login THEN invalid credentials is returned ") @DisplayName("GIVEN invalid credentials response WHEN trying to login THEN invalid credentials is returned ")
@ -72,7 +72,7 @@ internal class LoginUseCaseTest {
val actual = sut.invoke(LoginCredentials("a", "b")) val actual = sut.invoke(LoginCredentials("a", "b"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
@DisplayName("GIVEN success response WHEN trying to login THEN session is saved and success is returned") @DisplayName("GIVEN success response WHEN trying to login THEN session is saved and success is returned")
@ -100,6 +100,6 @@ internal class LoginUseCaseTest {
val actual = sut.invoke(LoginCredentials("a", "b")) val actual = sut.invoke(LoginCredentials("a", "b"))
Assertions.assertEquals(expected, actual) Assertions.assertEquals(expected, actual)
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
} }

View file

@ -17,8 +17,8 @@ import org.koin.test.KoinTest
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
@ -52,7 +52,7 @@ internal class LogoutUseCaseTest : KoinTest {
@DisplayName("WHEN no call THEN storage is not interacted") @DisplayName("WHEN no call THEN storage is not interacted")
@Test @Test
fun initializedDoesntAffectStorage() { fun initializedDoesntAffectStorage() {
verifyZeroInteractions(mockUserDataLocalStorage) verifyNoInteractions(mockUserDataLocalStorage)
} }
@DisplayName("WHEN logout invoked THEN storage is cleared") @DisplayName("WHEN logout invoked THEN storage is cleared")

View file

@ -6,8 +6,8 @@ import org.junit.jupiter.api.Test
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
@Suppress("TestFunctionName") @Suppress("TestFunctionName")
internal class SessionExpirationAdapterTest { internal class SessionExpirationAdapterTest {
@ -24,7 +24,7 @@ internal class SessionExpirationAdapterTest {
@DisplayName("WHEN nothing is changed THEN delegate is not touched") @DisplayName("WHEN nothing is changed THEN delegate is not touched")
@Test @Test
fun verifyNoInteractionsIfNoInvocations() { fun verifyNoInteractionsIfNoInvocations() {
verifyZeroInteractions(mockSessionExpirationListener) verifyNoInteractions(mockSessionExpirationListener)
} }
@DisplayName("WHEN onSessionExpired is called THEN delegated is also called") @DisplayName("WHEN onSessionExpired is called THEN delegated is also called")

View file

@ -25,7 +25,7 @@ project.ext {
testing_androidx_junit_version = "1.1.3" testing_androidx_junit_version = "1.1.3"
testing_androidx_arch_core_version = "2.1.0" testing_androidx_arch_core_version = "2.1.0"
testing_livedata_version = "1.2.0" testing_livedata_version = "1.2.0"
testing_kotlin_mockito_version = "3.1.0" testing_kotlin_mockito_version = "4.0.0"
testing_junit5_version = "5.7.0" testing_junit5_version = "5.7.0"
testing_json_assert_version = "1.5.0" testing_json_assert_version = "1.5.0"
testing_junit4_version = "4.13.2" testing_junit4_version = "4.13.2"

View file

@ -25,8 +25,8 @@ import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
import retrofit2.HttpException import retrofit2.HttpException
@ -88,7 +88,7 @@ class PlainSessionExpirationTest : KoinTest {
Assertions.assertEquals("login-access", contentRequestAfterRefreshed.getHeader("Authorization")) Assertions.assertEquals("login-access", contentRequestAfterRefreshed.getHeader("Authorization"))
val expectedSavedSession = Session(accessToken = "login-access", refreshToken = "login-refresh") val expectedSavedSession = Session(accessToken = "login-access", refreshToken = "login-refresh")
verify(mockNetworkSessionLocalStorage, times(1)).session = expectedSavedSession verify(mockNetworkSessionLocalStorage, times(1)).session = expectedSavedSession
verifyZeroInteractions(mockNetworkSessionExpirationListener) verifyNoInteractions(mockNetworkSessionExpirationListener)
} }
@DisplayName("GIVEN 401 THEN failing refresh WHEN content requested THE error is returned and callback is Called") @DisplayName("GIVEN 401 THEN failing refresh WHEN content requested THE error is returned and callback is Called")

View file

@ -27,8 +27,8 @@ import org.mockito.kotlin.doReturn
import org.mockito.kotlin.mock import org.mockito.kotlin.mock
import org.mockito.kotlin.times import org.mockito.kotlin.times
import org.mockito.kotlin.verify import org.mockito.kotlin.verify
import org.mockito.kotlin.verifyNoInteractions
import org.mockito.kotlin.verifyNoMoreInteractions import org.mockito.kotlin.verifyNoMoreInteractions
import org.mockito.kotlin.verifyZeroInteractions
import org.mockito.kotlin.whenever import org.mockito.kotlin.whenever
import retrofit2.HttpException import retrofit2.HttpException
@ -97,7 +97,7 @@ class SessionExpirationTest : KoinTest {
ContentData.refreshSuccessResponse.accessToken, ContentData.refreshSuccessResponse.accessToken,
retryAfterTokenRefreshRequest.getHeader("Authorization") retryAfterTokenRefreshRequest.getHeader("Authorization")
) )
verifyZeroInteractions(mockNetworkSessionExpirationListener) verifyNoInteractions(mockNetworkSessionExpirationListener)
} }
@DisplayName("GIVEN 401 THEN failing refresh WHEN content requested THE error is returned and callback is Called") @DisplayName("GIVEN 401 THEN failing refresh WHEN content requested THE error is returned and callback is Called")