【发布时间】:2020-07-30 08:53:37
【问题描述】:
我对为 Android 编写单元测试还是很陌生。我有两个问题:
- 在 JUnit 的 @Before 函数中为所有测试编写公共输入是否合适?
- 在单个单元测试中编写两组断言是否是一种好习惯,我的意思是我断言一些东西,然后我做一些操作,然后我再次做断言?
参考代码:
@ExperimentalCoroutinesApi
@RunWith(AndroidJUnit4::class)
@SmallTest
class TicketDaoTest {
@get:Rule
val instantExecutorRule = InstantTaskExecutorRule()
private lateinit var database: PickDatabase
private lateinit var ticket: Ticket
private var timeStamp = System.currentTimeMillis()
@Before
fun initSetup() = runBlockingTest {
timeStamp = currentTime
ticket = Ticket(
"purchaseId", 1, "originName", 1,
"destName", timeStamp, 1, "Cash", 2,
44.0, isCancelled = false, synced = false
)
database = Room.inMemoryDatabaseBuilder(
ApplicationProvider.getApplicationContext(),
PickDatabase::class.java
).build()
database.ticketDao().insert(ticket)
}
@After
fun closeDb() = database.close()
@Test
fun testGetRecentTickets_returnSingleTicketListBeforeTimeout() = runBlockingTest {
val tickets = database.ticketDao().getRecentTickets(timeStamp)
assertThat(tickets, hasSize(1))
assertThat(tickets, hasItem(ticket))
}
@Test
fun testSetSynced_returnsEmptyList() = runBlockingTest {
var tickets = database.ticketDao().getUnSyncedTickets()
assertThat(tickets, hasSize(1))
assertThat(tickets, hasItem(ticket))
database.ticketDao().setSynced(listOf(ticket.purchaseId))
tickets = database.ticketDao().getUnSyncedTickets()
assertThat(tickets, empty())
}
@Test
fun testRemoveTicketFromDatabase_returnsEmptyList() = runBlockingTest {
var tickets = database.ticketDao().getRecentTickets(timeStamp)
assertThat(tickets, hasSize(1))
database.ticketDao().removeTicketFromDatabase(ticket.purchaseId)
tickets = database.ticketDao().getRecentTickets(timeStamp)
assertThat(tickets, empty())
}
}
【问题讨论】:
-
对此没有真正的正确或错误答案,这取决于团队的意见和标准
标签: android unit-testing junit junit4