오목 피드백
라이브 코딩
DAO(Data Access Object)
- 데이터베이스의 data에 접근하기 위한 객체
- DataBase에 접근 하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용
SQLitebase를 생성자로 만들지 아니면 받을 지 고민해보는 것도 좋음
readable과 writable DB의 차이
- 둘의 차이를 고려해 DAO로 context를 넘겨주면 해당 함수에 맞는 DB를 사용 가능
Junit4 안드로이드 테스트
- Junit4로 안드로이드를 테스트하기 위해선 4에선
@RunWith(AndroidJUnit4::class)
선언
@RunWith(AndroidJUnit4::class)
class EntryDaoTest {
@Test
fun save(){
val entryDao = Entry(ApplicationProvider.getApplicationContext())
entryDao.insert(Entry("test1", "test2"))
}
@Test
fun save(){
val entryDao = Entry(ApplicationProvider.getApplicationContext())
val entries = entryDao.select()
assertThat(entries).hasSize()
}
}
- 이 테스트 코드의 문제점은 초기화를 안한다는 것!
- 테스트 코드의 중복을 방지하기 위해서! 데베를 DROP 하는 함수를 만들어 테스트 코드에서 실행해주기.
@Before
fun setUp(){
entryDao = EntryDao(pplicationProvider.getApplicationContext())
}
@After
fun tearDrop(){
//데이터 Drop시키는 코드...
}
@Test
fun save(){
val entry = Entry("test1", "test2")
assertThat(entries).isZero
entryDao.insert(entry)
assertThat(entries).isNotZero
}
- data class Entry의 id가 var인 것을 회수하기 위해서 insert() 함수 마지막에 return entry.copy(id = id)
- var id가 싫어파 일때
- DTO라고 하고 찐 Entry class 생성하는 법 있음
- insert 함수에서 entry를 반환하지 않고 테스트하는 법이 있을까?
interface EntryDao {
fun save(entry: Entry)
fun findAll(): List<Entry>
}
class FakeEntryDao: EntryDao{
private val entries: MutableMap<Long, Entry> = mutableMapOf()
override fun save(entry: Entry){
}
override fun findAll(): List<Entry>{
}
}
class EntryServiceTest{
private lateinit var entryDao: EntryDao
@Before
fun setUp(){
val entry = FakeEntryDao()
}
@Test
fun `부제가 비어있으면 없음으로 저장`(){
val entryService = EntryService(entryDao)
entryService.save("test", " ")
val actual = entryDao.findAll().first { it.title == "title" }
asserThat(actual)....
}
}
- 안드로이드 테스트에는 DAO에대한 테스트도 가능하다....
레벨 1에 대한 전반적인 질문