테스트/JUnit

    Junit5 의존성 주입 에러@Autowired ParameterResolutionException 과 해결방법

    Junit5 의존성 주입 에러@Autowired ParameterResolutionException 과 해결방법 보통 Spring을 사용하면 의존성 주입을 생성자 주입을 사용하여 받게 된다. 그래서 JUnit 테스트 에서도 @RequiredArgsConstructor 를 이용한 생성자 주입이 가능할 것 같지만 그렇지 않다. 만약 다음과 같이 생성자 주입을 받으려고 하면 다음과 같은 에러를 만난다 @RequiredArgsConstructor @SpringBootTest class ConstructorDiTest { private final MemberRepository memberRepository; private final MemberService memberService; ... } org.junit...

    Junit5 AssertJ List 정렬 테스트 ( Check if list is sorted in junit)

    Junit5 AssertJ List 정렬 테스트 ( Check if list is sorted in junit) JUnit5 에서 assertJ의 Assertions를 이용하여 List가 정렬되었는지 테스트 할 수 있다. isSorted() 메서드 isSortedAccordingTo(Comparator comparator) 메서드 docs : https://assertj.github.io/doc/ https://www.baeldung.com/introduction-to-assertj https://javadoc.io/doc/org.assertj/assertj-core/latest/org/assertj/core/api/ListAssert.html https://javadoc.io/doc/org.assert..

    RefectionTestUtils - private 필드 값 주입, private 테스트

    * https://docs.spring.io/spring-framework/docs/current/javadocapi/org/springframework/test/util/ReflectionTestUtils.html ReflectionTestUtils 클래스는 Spring Test Context 프레임워크의 일부이다. 단위 및 통합 테스트에서 사용되는 리플렉션 기반 유틸리티 메서드들을 모은 클래스이며, private field 를 설정하고 private field 호출하고 을 dependencies을 주입할 수 있다. 일반적인 비즈니스 애플리케이션을 개발한다면 사실 프로덕션 코드에서 리플렉션을 사용할 경우는 거의 없다. 라이브러리나 프레임워크 등을 개발할 때 주로 사용될 수 있다. 하지만 테스트 코드에서..

    Spring Boot JPA Test @DataJpaTest 기본 설정

    Spring Boot JPA Test @DataJpaTest 기본 설정 jpa관련 테스트(Entity, Repository)를 할때 @DataJpaTest를 이용해서 진행하면 JPA관련 Bean과 @Transactional 어노테이션이 달려있어서 테스트가 끝나면 Configuration만 주입받아서 빠르게 테스트를 진행할 수 있다. @Transactional 어노테이션이 달려있어서 테스트가 끝나면 롤백도 되어서 간단하게 결과를 확인할 수 있는 장점이 있다. MySQL, MSSQL, Oracle 처럼 다른 DB를 연동해서 사용할 수도 있지만, 이 글에서는 in-memory DB인 H2를 연동해서 테스트 하는 방법을 정리하고자 한다. 환경 SpringBoot : 2.7.3 Java : JDK11 MacOS ..

    JUnit5 - Java에서의 단위테스트5 Mock, Mockito, Stup

    Mock 객체 Stubbing stub이란 토막,꽁초,남은부분,몽당연필.. 이라는 뜻으로 dummy객체가 마치 실제로 동작하는 것 처럼 보이도록 만들어놓은 것 즉 Mock 객체의 행동을 조작하는 것 모든 Mock 객체의 행동 Null을 리턴한다. (Optional 타입은 Optional.empty 리턴. 즉 비어있는 옵셔널 객체) Primitive 타입은 기본 Primitive 값. 콜렉션은 비어있는 콜렉션. Void 메소드는 예외를 던지지 않고 아무런 일도 발생하지 않는다. 예제1 memberService.findById(1L) member 객체를 나오게 할라면 다음과 같이 쓰면 된다. 만약 2L, 3L 등 다른 member 객체를 나오게 한다면 오류가 난다. 1L로만 member를 나오게 했기 때문 ..

    JUnit5 - Java에서의 단위테스트4 Mock, Mockito

    Mockito란? Mockito는 개발자가 동작을 직접 제어할 수 있는 가짜(Mock) 객체를 지원하는 테스트 프레임워크. Mock: 진짜 객체와 비슷하게 동작하지만 그동작을 직접 그 객체의 행동을 관리하는 객체. Mockito: Mock 객체를 쉽게 만들고 관리하고 검증할 수 있는 방법을 제공한다. 테스트를 작성하는 자바 개발자 50%+ 사용하는 Mock 프레임워크. 단위 테스트에 고찰 참조 : https://martinfowler.com/bliki/UnitTest.html Mock Object를 만들어 주입시켜주는 방법을 지원해주는 라이브러리이다. Mockito는 과거에는 static메서드를 지원하지 않는 단점이 있어 PowerMock을 대안으로 사용했으나 Mockito 3.4.0부터는 static ..

    JUnit5 - Java에서의 단위테스트3 - 테스트 인스턴스들

    JUnit은 테스트 메소드 마다 테스트 인스턴스를 새로 만든다. 기본 전략. 테스트 메소드를 독립적으로 실행하여 예상치 못한 부작용을 방지하기 위함이다. 이 전략을 JUnit 5에서 변경할 수 있다. 즉 테스트마다 필드를 공유하지 않는다. 테스트 메서드마다 System.out.println(this) 를 찍어보면 인스턴스가 다르단 걸 알 수 있다. @TestInstance(Lifecycle.PER_CLASS) 테스트 클래스당 인스턴스를 하나만 만들어 사용한다. -> 하나의 인스턴스를 공유한다 경우에 따라, 테스트 간에 공유하는 모든 상태를 @BeforeEach 또는 @AfterEach에서 초기화 할 필요가 있다. @BeforeAll과 @AfterAll을 인스턴스 메소드 또는 인터페이스에 정의한 defau..

    JUnit5 - Java에서의 단위테스트2 - 테스트 반복

    반복해서 테스트를 하고 싶을 때 다음과 같이 사용할 수 있다. @RepeatedTest 반복 횟수와 반복 테스트 이름을 설정할 수 있다. @RepeatedTest(value, name ) 옵션들 {displayName} {currentRepetition} {totalRepetitions} RepetitionInfo 타입의 인자를 받을 수 있다. @RepeatedTest(10) void repeatTest(RepetitionInfo repetitionInfo) { System.out.println("반복 테스트 " + repetitionInfo.getCurrentRepetition() + " \n" + // 현재 반복 횟수 repetitionInfo.getTotalRepetitions()); // 총 반복..

    JUnit5 - Java에서의 단위테스트 1

    Java의 단위 테스트(Unit Test) 테스트 코드를 작성하는 이유 개발 단계에서 테스트 코드를 작성하는 이유는 정말 다양하다. 개발 과정에서 미리 문제를 발견할 수 있다. 코드에 잠재되어있떤 문제를 발견하는데 큰 도움이 된다. 리팩토링의 리스크가 줄어든다. 서비스 업데이트를 하거나 요구사항이 변경되면 코드가 추거되거나 수정되는데, 그 코드에 연관된 다른 코드에 까지 영향을 준다. 코드를 수정하는 과정에서의 버그들이나 잘못된 점을 빠르게 잡을 수 있다. 애플리케이션을 가동해서 직접 테스트하는 것보다 테스트를 빠르게 진행할 수 있다. 테스트 코드를 공유함으로써 이 테스트와 이 기능이 무엇을 하는지 알 수 있다. 하나의 명세 문서로서의 기능을 수행한다 몇 가지 프레임워크에 맞춰 테스트 코드를 작성하면 좋..