이번글에서는 MockMvc를 사용해 RestController를 test하는 방법에 대해 알아보도록 하겠습니다. 1. RestController 먼저 이번 글에서 사용할 RestController를 아래와 같이 생성했습니다. 별다른 내용없이 GET으로 "/hello"를 호출하면, "Hello World"를 return 해주는 API입니다. HelloResource @RestController @RequestMapping("/hello") public class HelloResource { @GetMapping public String helloWorld(){ return "Hello World!"; } } 2. Get API Test 이제 위에서 작성한 GET API를 테스트 해보겠습니다. 2-1) Te..
이번글에서는 test에서 특정 메서드만 override 하는 방법인 Spy에 대해 알아보도록 하겠습니다. 1. Mock Instance 우리는 이전 글에서 Stub와 Mock을 사용해 특정 인스턴스의 business logic을 override 하는 방법을 살펴보았습니다. 즉 Stub와 Mock을 사용했다면 해당 인스턴스 내부의 모든 business logic의 수행은 무력화 되며, 하드코딩으로 직접 명시한 메서드가 아닐 경우에는 null을 return 할 것입니다. 예를 들어 아래와 같은 LoanApplication을 Mock으로 생성한 경우, 아래의 모든 메서드는 실행되지 않으며, 각 메서드를 test에서 사용하고자 한다면 return 값을 직접 하드코딩해 명시해줘야 했습니다. LoanApplicat..
이번글에서는 prime number 예제를 통해 좋은 test code를 작성하는 방법에 대해 알아보도록 하겠습니다. 1. Check Prime Number 먼저 아래와 같이 Prime Number 인지 아닌지를 확인하는 NumberValidator 클래스가 있다고 가정해보겠습니다. NumberValidator public class NumberValidator { public boolean isItPrime(int number) { int maxDivisor = (int)Math.sqrt(number); for(int i=2;i
이번글에서는 Mock의 Fake 기능과, Stub를 대체하는 방법에 대해 알아보도록 하겠습니다. 1. Stub & Mock 이전까지의 글을 통해 우리는 Stub는 data를 test 할 때 사용하며, Mock은 behavior를 test 할 때 사용한다고 이해했습니다. 공통점으로는 Stub와 Mock 둘다 external dependency를 override 하는 방법으로 사용한다는 것 또한 이해할 수 있었습니다. 2. Fake 그렇다면 만약 test 할때 관심없는 부분들을 제외하고 test 하기 위해선 어떻게 해야될까요? 이와 같은 경우도 동일하게 Mock을 사용해 구현할 수 있습니다. 이를 우리는 Fake 라고 합니다. 예를 들어 test 하고자하는 business logic 내부에 아래와 같은 lo..
이번글에서는 JUnit의 Mock을 활용해 behavior를 테스트 해보도록 하겠습니다. 1. Test Behavior 1-1) Test Result 이전 글과 동일하게 ISBN Number를 예를 들어보겠습니다. 우리는 이전 글에서 Assert를 사용해 최종 결과값과 기대하는 값을 비교하는 테스트를 진행했었습니다. 예를 들어 getLocatorCode("014077396")의 최종 결과값이 "7396J4"와 같은지를 테스트 했습니다. 즉, 우리는 result를 test 했었다고 이해할 수 있습니다. Test Result Example @Test public void canGetCorrectLocatorCode(){ // Stub ExternalISBNDataService service = new Ext..
이번글에서는 JUnit의 Stub에 대해 알아보도록 하겠습니다. 1. Stub란? 테스트 용도로 하드 코딩한 값을 반환하는 구현체를 의미합니다. Stub은 주로 external service를 사용하는 code를 테스트할 때 사용합니다. 여기서 external service는 database, web service 등을 의미합니다. 우리는 databse와 connect 하거나 web service를 call 할 수 있는지에대해 test하고 싶은 것이 아닙니다. 따라서, 이와 같은 부분들은 하드코딩으로 대체하고, 우리가 test 하고자하는 business logic에 집중하고자 Stub을 사용합니다. Stub을 사용하지 않을 경우 위와 같은 external service가 down 된다면 우리가 작성한 c..
5. Refactoring 계속해서 refactoring을 진행하도록 하겠습니다. https://en.wikipedia.org/wiki/International_Standard_Book_Number 에 따르면 ISBN Number의 로직은 아래의 code를 만족해야 합니다. 따라서 이를 참고해 checkISBN 메서드를 수정해야합니다. 😎 위키피디아의 설명에 따르면 ISBN number는 0 ~ 10 digits 사이의 number라고 되어있지만, 현재의 테스트에서는 그것을 고려하지 않습니다. 해당 내용은 또다른 테스트를 작성해 만들어야 합니다. Wikipedia // Returns ISBN error syndrome, zero for a valid ISBN, non-zero for an invalid ..
이번 글에서는 TDD에 대해 알아보도록 하겠습니다. 1. TDD란? test먼저 작성하고 그 test를 통과시키는 code를 작성하는 방법입니다. 예를 들어 A+B를 더하는 메서드를 만들어야 하는 상황이라면, A+B를 더하는 메서드를 작성하기전에 그것을 테스트하는 코드를 먼저 작성합니다. 작성한 테스트는 당연히 실패할 것이고, 이제 해당 테스트가 통과할 수 있도록 메서드를 작성하면 되겠습니다. 이 때 각 테스트는 'single piece of logic'을 테스트해야 합니다. 하나의 메서드에 대해서 여러상황에 대한 테스트를 늘려나가다보면 어느새 완벽한 메서드가 만들어지게 되있을 것 입니다..😎! 2. Valid ISBN Number 이제 순서대로 TDD를 통해 코드를 작성해보도록 하겠습니다. 최종적으로 ..