5/2 수업

hyunji·2023년 5월 2일
0
post-thumbnail

MVP


MVC

  • 많은 기능들을 추가하다보면 Activity에 몰아넣게 됨. 단점!!
  • 이걸 개선하기 위한게 MVP 패턴

MVP

  • view와 model 분리
  • model은 변경사항이 없음(mvc에서 썼던 모델이랑 같음)
  • view는 어떤 처리를 해야 하는지 등에 대해 최대한 아는 것이 없어야 함
  • Presenter은 Model과 상호작용하고 View에 UI 갱신을 요청함(요청!!!!! 직접 갱신 X)

MVC to MVP

  • model은 그대로 쓸 수 있음
  • View와 Presenter를 위한 Contract 인터페이스를 추가해야 함
    - 장점 : 뷰와 프레젠터가 1대 1로 대응할 텐데 각각 어떤 메서드가 필요하고 구현해야하는지 관계를 알 수 있어 좋다. 문서 같은 역할
  • MVC에서 컨트롤러 역할을 했던게 View가 되겠죠?
  • 왜 인터페이스로 만들까?
    - 결합도도 낮출 수 있고, 필요한 메서드만 쓸 수 있고, 테스트할 때도 유용

Presenter 테스트

  • mockK으로 가짜 뷰 객체 만들어서 넘겨주자!
private lateinit var presenter: MainPresenter
private lateinit var view: Contract.View

@Before
fun setUp() {
    view = mockk()
    presenter = MainPresenter(view)
}
  • slot!
  • 사용 예제 (안스 파일에서 더 자세히 다루고 있음! 그거 보러가!)
 @Test
    fun `더하기 버튼을 누르면 숫자 값이 1씩 증가한다`(){
        //given
        val slot = slot<Int>()
        every { view.setCounterText(capture(slot)) } answers {
            println("slot = ${slot.captured}")
        }

        //when: 누르는 메서드 호출
        presenter.add()

        //then
        val actual = slot.captured
        assertEquals(1, actual)
        verify { view.setCounterText(actual) }
    }

MVC 였다면?

  • unit 테스트로만 불가. espresso를 써서 테스트 해야함. Why? 종속성이 있어서!

0개의 댓글