본문 바로가기

test4

[MockK] mock 객체가 호출되지 않았음을 검증하기 기능 개발을 하다보면 상태 값에 따라 특정 기능을 실행할지 말지 분기를 탈 필요가 있다. class SomeService( private val someFeature: SomeFeature, ) { fun executeIfFlagIsOn(flag: Boolean) { if (flag) { this.someFeature.execute() } } } class SomeFeature { fun execute() {} } 위와 같이 SomeService#executeIfFlagIsOn 메서드는 flag 파라미터를 통해 SomeFeature기능을 실행할지 말지를 결정하는 코드가 있을 때, MockK를 사용하여 SomeFeature의 기능이 실행되거나 안되었음을 테스트하기 위해서 wasNot(called: Call.. 2022. 10. 21.
직접적인 테스트와 간접적인 테스트 협업 중에 생긴 일화를 바탕으로 직접적인 테스트와 간접적인 테스트에 대한 개인적인 소견에 대해 적어본다. 테스트 코드를 작성하다보면 코드에 대한 테스트가 중복적으로 발생할 여지가 생길 때가 있다. 이 때 테스트를 어디에 짜는 것이 좋을까? 말로만 하면 애매하니 간단한 예제를 들어보자. 우리가 쓰는 신용카드, 체크카드는 유효기간(년, 월)을 갖고 있다. 그리고 해당 유효기간과 동일한 년, 월 까지는 카드가 유효하다. (e.g. 유효기간이 2022년 1월 이라면, 2022년 1월 31일 까지는 해당 카드는 유효하며, 2월 1일 부터는 만료된 것이다) 이 정보를 간단한 엔티티와 엔티티에 대한 정보를 담는 DTO 코드로 옮겨보자. import java.time.LocalDateTime import java.ti.. 2022. 5. 8.
[MockK] 인자 값 그대로 리턴하기 Mock 객체를 사용하다보면 JpaRepository.saveAll과 같이 입력값을 그대로 리턴해주고 싶은 경우가 생길 수 있다. 이 경우 returnsArgument를 사용하면 된다. interface TestTarget { fun function(arg1: Any, arg2: Any): Any } internal class MyRepositoryMockTest : DescribeSpec({ it(" returnsArgument 0은 첫번째 인자를 리턴한다") { // given val testTargetMock= mockk() // when every { testTargetMock.function(any(), any()) } returnsArgument 0 // then testTargetMock.f.. 2022. 4. 14.
gradle multi module test 속도를 높여보자 (with parallel) gradle multi module 기반으로 개발을 할 때 각 모듈의 테스트 속도가 오래 걸릴 경우 전체 테스트 시간이 길어져서 전체적인 개발 사이클이 그만큼 느려지게 되는데, multi module 환경에서 모듈 별 테스트를 병렬로 실행시켜 테스트 속도를 높일 수 있는 방안에 대해 알아보자. 테스트에 사용된 코드는 여기에서 확인할 수 있다. 다음과 같이 test1, test2, test3 모듈을 생성하고 각 모듈의 테스트가 일부러 오래걸리도록 Testcontainers를 사용하여 테스트를 실행하도록 하였다. @SpringBootTest class Test1ApplicationTests { companion object { private val mysqlContainer = MySQLContainer(".. 2021. 7. 29.