Java Gradle Project에서 Unit Test코드 작성하기

이미지
Test 코드 작성하기 먼저 다음과 같이 간단한 클래스를 만든다.  public class Calculator { public int plus(int x, int y) { return x + y; } } Intellij에서는 클래스 이름(Calculator)에서 Code Generate를 실행하면 Test코드를 작성할 수 있다.  이때 Destination package는 소스 코드와 동일하게 지정해야 추후 관리하기 쉽다.  테스트 이름 명명법 given, when, then 으로 이름을 구성한다. 그러면 해당 테스트에 대한 입력, 실행, 출력을 쉽게 파악할 수 있다. 그리고 테스트 코드도 given, when, then의 영역으로 나누어 구성한다. given에서는 입력 데이터, 객체들, 목(mock)을 준비하고, When에서는 실행될 함수들을 기술한다. 그리고 Then에서는 assertion을 사용하여 출력값과 기대값을 확인한다.  테스트는 반드시 기대값과 실제값을 확인해야 한다. 이를 위해 Assertion.assertEquals와 같은 함수를 사용한다. 다음은 이와 같은 규칙에 의해 작성한 테스트 코드다. class CalculatorTest { @Test void givenTwoIntegers_whenPlus_thenReturnSum() { // given Calculator calculator = new Calculator(); int inputX = 1; int inputY = 2; // when int actual = calculator.plus(inputX, inputY); int expected = 3; // then assertEquals(expected, actual); } } 테스트 코드 작성 요령 1. 하나...

Java의 Matcher를 활용한 정규식 검색 및 추출

Java에서는 정규식 패턴 확인 및 추출을 위해 Matcher class의 find()나 matches() 메소드를 사용하게 된다. find()는 하나의 문자열 안에 여러 개의 정규식 패턴을 찾을 때 사용하며, matches()는 하나의 문자열과 하나의 정규식 표현이 일치하는지를 확인할 때 사용한다.  find() 메소드 Matcher.find()는 하나의 문자에 여러 개의 정규식 패턴을 찾을 때 사용한다. 주어진 문자열에 정규식에 해당하는 n개의 패턴이 있다면 find()를 n번째 호출할 때까지는 true가 반환되며 이후 false가 반환된다. find()가 true일때는 start(), group(), end()메소드를 호출할 수 있다. start는 문자열 내에서 정규식 패턴이 발견된 문자열의 시작 index, end는 끝 index를 의미한다. gruop은 정규식 패턴에 해당하는 문자열 자체를 반환한다. Pattern stringPattern = Pattern.compile("[a-zA-Z]+"); Matcher m = stringPattern.matcher("hello there how are you"); while (m.find()) { int start = m.start(); String group = m.group(); int end = m.end(); System.out.println("position [%d, %d] = %s".formatted(start, end, group)); } 위 코드를 실행하면 다음과 같이 출력된다. position [0, 5] = hello position [6, 11] = there position [12, 15] = how position [16, 19] = are position [20, 23] = you find(int start) find를 호출할 때 int start라는 인자를 지정하면 해당 인덱스로부터 정규식...

Java8 Stream API

  개요 Java8에서 도입된 Stream API에 대해 알아보자. Stream API는 lambda식, Optional등과 함께 반드시 알아야 할 Java8의 기능이다. Stream생성 Stream을 만드는 방법은 다양하다. 한 가지 중요한 특징은  stream을 만들어서 연산을 적용하더라도 원본 데이터는 변하지 않는다 는 점이다. 따라서 하나의 원본 데이터에서 여러 개의 stream을 만들어서 사용해도 무방하다.   빈 Stream 생성 Stream<String> emtpyStream = Stream.empty();   Collection으로부터 생성 List나 Set과 같은 Collection으로부터 Stream을 만들 수 있다. Collection<String> list = Arrays.asList("s1", "s2", "s3"); Stream<String> streamFromList = list.stream(); Set<String> set = new HashSet<>(Arrays.asList("a", "b", "b")); Stream<String> streamFromSet = set.stream();   배열로부터 생성 String[] arr = new String[]{"s1", "s2", "s3"}; Stream<String> stream = Arrays.stream(arr);   builder를 사용하여 생성 Stream<String> stream = S...