Писал ли unit-тесты

Ответ

Да, писал unit-тесты с использованием JUnit и Mockito. Например, для тестирования ViewModel:

class MyViewModelTest {
    @Mock
    private lateinit var repository: MyRepository

    @Before
    fun setup() {
        MockitoAnnotations.openMocks(this)
    }

    @Test
    fun `test data loading`() {
        val testData = listOf("test1", "test2")
        `when`(repository.getData()).thenReturn(testData)

        val viewModel = MyViewModel(repository)
        viewModel.loadData()

        assertEquals(testData, viewModel.data.value)
    }
}

Использую:

  • JUnit для базовых тестов
  • Mockito для моков зависимостей
  • Truth/Kotest для ассертов
  • Coroutines Test для тестирования корутин
  • Espresso для UI тестов (хотя это уже не unit)

Ответ 18+ 🔞

Э, слушай, а я вот тоже тесты пишу, ебать мои старые костыли. Ну, то есть, не то чтобы я это обожаю, но без них сейчас — как без штанов на людях, понимаешь? Чисто для галочки, чтобы тимлид не орал, что мы говнокод пишем.

Вот смотри, накидал пример, как обычно это выглядит. Берёшь эту свою ViewModel, которая там бизнес-логикой страдает, и начинаешь её мучать.

class MyViewModelTest {
    @Mock
    private lateinit var repository: MyRepository

    @Before
    fun setup() {
        MockitoAnnotations.openMocks(this)
    }

    @Test
    fun `test data loading`() {
        val testData = listOf("test1", "test2")
        `when`(repository.getData()).thenReturn(testData)

        val viewModel = MyViewModel(repository)
        viewModel.loadData()

        assertEquals(testData, viewModel.data.value)
    }
}

Смысл-то простой, ёпта. Берёшь репозиторий, который в реальности лезет в сеть или базу, и подсовываешь ему хуй с горы — то есть мок. Говоришь: «Слушай, дружок-пирожок, когда у тебя вызовут getData(), ты верни вот этот лист с двумя строками и не пизди». А потом создаёшь вьюмодель, скармливаешь ей этот поддельный репозиторий, дергаешь метод loadData() и смотришь: а получилось ли у неё то же самое, что ты ожидал? Если да — красота, терпения ноль ебать, тест зелёный, можно идти пить кофе.

А инструменты-то какие, я д р ё н а в о ш ь:

  • JUnit — это как базовый молоток. Без него нихуя не соберёшь, но одним им много не наотбиваешь.
  • Mockito — вот это уже сила. Когда нужно, чтобы какой-нибудь тяжёлый сервис не лез в интернет, а вёл себя как послушная мартышлюшка и возвращал то, что ты сказал.
  • Truth или Kotest для проверок. Ну, assertEquals — это скучно, а с ними можно писать assertThat(actual).containsExactly("test1", "test2"). Чувствуешь разницу? Как будто не гвозди забиваешь, а скульптуру ваяешь.
  • Coroutines Test — это отдельная песня. Без него асинхронщину тестировать — это доверия ебать ноль. Запутаешься в этих диспетчерах, и всё, накрылся медным тазом твой тест.
  • Espresso — это, конечно, уже не юнит, это UI. Тут уже не логику проверяешь, а тыкаешь пальцем в экран, как обезьяна, и смотришь, не развалилось ли всё. Но тоже нужно, хитрая жопа этот интерфейс, сам по себе сломаться может.

В общем, сам от себя охуел, как подробно расписал. Но суть простая: пишешь код, который проверяет другой код, чтобы потом не пришлось всю ночь искать, где же ты, распиздяй, опять забыл проверить на null.