2 рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрд╡реЗрджрди рдХреЛ рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП

рд╣рд╛рдп, рд╣реИрдмреНрд░ред рдореЗрд░рд╛ рдирд╛рдо рдЗрд▓реНрдпрд╛ рд╕реНрдорд┐рд░рдиреЛрд╡ рд╣реИ, рдореИрдВ рдлрд╝рд┐рдиреНрдЪ рдкрд░ рдПрдХ рдПрдВрдбреНрд░реЙрдЗрдб рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВред рдореИрдВ рдЖрдкрдХреЛ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдХреБрдЫ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рд╣рдордиреЗ рдЕрдкрдиреА рдЯреАрдо рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдП рд╣реИрдВред

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдЕрдиреБрд░реВрдкрддрд╛ рдЬрд╛рдБрдЪ рдФрд░ рдХреЙрд▓ рдЬрд╛рдБрдЪред рдЖрдЗрдП рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдзреНрдпрд╛рди рджреЗрдВред

рдЕрдиреБрдкрд╛рд▓рди рдкрд░реАрдХреНрд╖рдг


рдЕрдиреБрд░реВрдкрддрд╛ рдкрд░реАрдХреНрд╖рдг рдпрд╣ рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдгрд╛рдо рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдореБрдЭреЗ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ - рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдПрдХ рдЖрд╡реЗрджрди рд╣реИ рдЬреЛ рджрд┐рди рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдЪрд╛рд░реЛрдВ рдХреА рд╕реВрдЪреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ:



рд╕рдорд╛рдЪрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рдкрд░рдд рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдкрд░ рдирд┐рдореНрди рдореЙрдбрд▓ рдореЗрдВ рддрдмреНрджреАрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ:

data class News( val text: String, val date: Long ) 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реВрдЪреА рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдлреЙрд░реНрдо рдХрд╛ рдПрдХ рдореЙрдбрд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИ:

 data class NewsViewData( val id: String, val title: String, val description: String, val date: String ) 

рдбреЛрдореЗрди рдореЙрдбрд▓ рдХреЛ рд╡реНрдпреВ рдореЙрдбрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд░реНрдЧ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛:

 class NewsMapper { fun mapToNewsViewData(news: List<News>): List<NewsViewData> { return mutableListOf<NewsViewData>().apply{ news.forEach { val textSplits = it.text.split("\\.".toRegex()) val dateFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale("ru")) add( NewsViewData( id = it.date.toString(), title = textSplits[0], description = textSplits[1].trim(), date = dateFormat.format(it.date) ) ) } } } } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдХреБрдЫ рд╡рд╕реНрддреБ

 News( "Super News. Some description and bla bla bla", 1551637424401 ) 

рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛

 NewsViewData( "1551637424401", "Super News", "Some description and bla bla bla", "2019-03-03 21:23" ) 

рдЗрдирдкреБрдЯ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдЬреНрдЮрд╛рдд рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЖрдк mapToNewsViewData рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдирдкреБрдЯ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдЙрдЯрдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдЧрд╛ред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдкреНрд▓рд┐рдХреЗрд╢рди / src / test / ... рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, рдирд┐рдореНрди рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде NewsMapperTest рд╡рд░реНрдЧ рдмрдирд╛рдПрдВ:

 class NewsMapperTest { private val mapper = NewsMapper() @Test fun mapToNewsViewData() { val inputData = listOf( News("Super News. Some description and bla bla bla", 1551637424401) ) val outputData = mapper.mapToNewsViewData(inputData) Assert.assertEquals(outputData.size, inputData.size) outputData.forEach { Assert.assertEquals(it.id, "1551637424401") Assert.assertEquals(it.title, "Super News") Assert.assertEquals(it.description, "Some description and bla bla bla") Assert.assertEquals(it.date, "2019-03-03 21:23") } } } 

рдкреНрд░рд╛рдкреНрдд рдкрд░рд┐рдгрд╛рдо рдХреА рддреБрд▓рдирд╛ org.junit.Assert рдкреИрдХреЗрдЬ рд╕реЗ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкреЗрдХреНрд╖рд╛рдУрдВ рдХреЗ рд╡рд┐рд░реБрджреНрдз рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдХреЛрдИ рдореВрд▓реНрдп рдЕрдкреЗрдХреНрд╖рд╛ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рдкрд░реАрдХреНрд╖рд┐рдд рд╡рд░реНрдЧ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХреБрдЫ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд▓реЗрддрд╛ рд╣реИред рдпрд╣ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рд╕рдВрд╕рд╛рдзрди рддрд░реНрдХ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕рдВрд╕рд╛рдзрди рдкреНрд░рдмрдВрдзрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рдорд╛рди рдирдХрд▓реА рд╡рд╕реНрддреБ рдмрдирд╛рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред рдПрдХ рдирдХрд▓реА рд╡рд╕реНрддреБ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдХрд╛рд▓реНрдкрдирд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдЖрдВрддрд░рд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдХреЙрд▓ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд░рд┐рдЯрд░реНрди рдорд╛рди рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдирдХрд▓реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓реЛрдХрдкреНрд░рд┐рдп рдореЙрдХрд┐рдЯреЛ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред
рдХреЛрдЯрд▓рд┐рди рдореЗрдВ, рд╕рднреА рдХрдХреНрд╖рд╛рдПрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдВрддрд┐рдо рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рдореЙрдХрд┐рдЯреЛ рдкрд░ рдирдХрд▓реА рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рд╕реАрдорд╛ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдореЙрдХрд┐рдЯреЛ-рдЗрдирд▓рд╛рдЗрди рдирд┐рд░реНрднрд░рддрд╛ рдЬреЛрдбрд╝реЗрдВред

рдпрджрд┐ рдЖрдк рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрддреЗ рд╕рдордп рдХреЛрдЯрд▓рд┐рди dsl рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╡рд┐рднрд┐рдиреНрди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдореЙрдХрд┐рдЯреЛ-рдХреЛрдЯрд▓рд┐рди ред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ NewsMapper рдПрдХ рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд NewsRepo рд▓реЗрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рд╕рдорд╛рдЪрд╛рд░ рдЖрдЗрдЯрдо рдХреЛ рджреЗрдЦрдиреЗ рд╡рд╛рд▓реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИред рддрдм рдпрд╣ NewsRepo рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рддрд╛ рд╣реИ рдФрд░ isNewsRead рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░ mapToNewsViewData рд╡рд┐рдзрд┐ рдХреЗ рд░рд┐рдЯрд░реНрди рдорд╛рдиреЛрдВ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИред

 class NewsMapperTest { private val newsRepo: NewsRepo = mock() private val mapper = NewsMapper(newsRepo) тАж @Test fun mapToNewsViewData_Read() { whenever(newsRepo.isNewsRead(anyLong())).doReturn(true) ... } @Test fun mapToNewsViewData_UnRead() { whenever(newsRepo.isNewsRead(anyLong())).doReturn(false) ... } тАж } 

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЙрдХ-рдСрдмреНрдЬреЗрдХреНрдЯ рдЖрдкрдХреЛ рд╡рд┐рднрд┐рдиреНрди рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕реА рдореВрд▓реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд░реВрдкрддрд╛ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдбреЗрдЯрд╛ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡рд┐рдзрд┐ рдЬреЛ рд╡рд┐рд╢реЗрд╖ рд╡рд░реНрдгреЛрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдиреНрдпреВрдирддрдо рд▓рдВрдмрд╛рдИ рдХреЗ рд▓рд┐рдП рджрд░реНрдЬ рдкрд╛рд╕рд╡рд░реНрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреА рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдмреБрд▓рд╛рдУ


рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдпрд╣ рдЬрд╛рдВрдЪрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╡рд░реНрдЧ рдХреА рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рдЕрдиреНрдп рд╡рд░реНрдЧ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЛ рдмреБрд▓рд╛рддреА рд╣реИ рдпрд╛ рдирд╣реАрдВред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░, рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдмрджрд▓рддреЗ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рд╕рдорд╛рдЪрд╛рд░ рд╕реВрдЪреА рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:

 class MainPresenter( private val view: MainView, private val interactor: NewsInteractor, private val mapper: NewsMapper ) { var scope = CoroutineScope(Dispatchers.Main) fun onCreated() { view.setLoading(true) scope.launch { val news = interactor.getNews() val newsData = mapper.mapToNewsViewData(news) view.setLoading(false) view.setNewsItems(newsData) } } тАж } 

рдпрд╣рд╛рдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрдВрдЯрд░реЗрдХреНрдЯрд░ рдФрд░ рд╡реНрдпреВ рд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдмрд╣реБрдд рддрдереНрдп рд╣реИред рдкрд░реАрдХреНрд╖рдг рдЗрд╕ рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:

 class MainPresenterTest { private val view: MainView = mock() private val mapper: NewsMapper = mock() private val interactor: NewsInteractor = mock() private val presenter = MainPresenter(view, interactor, mapper).apply { scope = CoroutineScope(Dispatchers.Unconfined) } @Test fun onCreated() = runBlocking { whenever(interactor.getNews()).doReturn(emptyList()) whenever(mapper.mapToNewsViewData(emptyList())).doReturn(emptyList()) presenter.onCreated() verify(view, times(1)).setLoading(true) verify(interactor).getNews() verify(mapper).mapToNewsViewData(emptyList()) verify(view).setLoading(false) verify(view).setNewsItems(emptyList()) } } 

рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╕рдм рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреА рддрдХрдиреАрдХ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд░рд╛рдЗрдб рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рдХреЛрдЯрд▓рд┐рди рдХреЙрд░рдЖрдЙрдЯреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ Dispatchers.Main рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдПрдВрдбреНрд░реЙрдЗрдб рдпреВрдЖрдИ рдереНрд░реЗрдб рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдЕрд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред RxJava рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ TestRule рдмрдирд╛рдирд╛ рдЬреЛ рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдкреНрд░рд╡рд╛рд╣ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рддреНрдпрд╛рдкрд┐рдд рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдРрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рд▓реЗ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рддрд░реНрдХреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдХреА рдЬрд╛ рд░рд╣реА рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред

*****


рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЛрдб рдХреЗ рдПрдХ рдмрдбрд╝реЗ рдкреНрд░рддрд┐рд╢рдд рдХреЛ рдХрд╡рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЖрд╡реЗрджрди рдЕрдзрд┐рдХ рд╕реНрдерд┐рд░ рдФрд░ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЯреЗрд╕реНрдЯ-рдХрд╡рд░ рдХреЛрдб рдмрдирд╛рдП рд░рдЦрдирд╛ рдЖрд╕рд╛рди рд╣реИ, рд╕реНрдХреЗрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рдХреА рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рддреНрд░рд╛ рд╣реИ рдХрд┐ рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рддреЗ рд╕рдордп, рдХреБрдЫ рднреА рдирд╣реАрдВ рдЯреВрдЯреЗрдЧрд╛ред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдХреЛрдб рдХреЛ рд░рд┐рдлрд▓реЗрдХреНрдЯрд░ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред

рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд░реНрдЧ рдореЗрдВ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдирд┐рд░реНрднрд░рддрд╛ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдореЙрдХ-рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛рдПрдВ рдПрдХ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдХреЗ рддрд╣рдд рдкрд░рдд рдореЗрдВ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред

рдЕрдЪреНрдЫрд╛ рдХреЛрдб рдкрд░реАрдХреНрд╖рдг рдпреЛрдЧреНрдп рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрдиреЗ рдХреА рдЬрдЯрд┐рд▓рддрд╛ рдпрд╛ рдЕрдХреНрд╖рдорддрд╛ рдЖрдорддреМрд░ рдкрд░ рджрд┐рдЦрд╛рддреА рд╣реИ рдХрд┐ рдХреЛрдб рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЧрд▓рдд рд╣реИ, рдФрд░ рдпрд╣ рд╕рдордп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред

Source: https://habr.com/ru/post/hi447588/


All Articles