Junit 사용해보기
- 모든 테스트 시작 전에 한 번 실행이 됩니다. 메서드가 static 이어야 한다.
- 각 테스트가 시작하기 전에 @Before 어노테이션이 붙은 메서드를 먼저 실행하고 테스트가 시작된다.
- 각 테스트가 시작하고 난 뒤 @After 어노테이션이 붙은 메서드가 실행이 된다.
- 모든 테스트가 끝난 후 한 번 실행이 됩니다. 메서드가 static 이어야 한다.
- assertTrue, assertThat,
- @Test(expected= ~~~.class)
- try/catch + fail
- @Rule을 이용한 방식
- Junit 4의 @BeforeClass 처럼 현재 클래스의 모든 테스트 클래스 보다 먼저 실행이 되며 해당 메서드는 static 해야된다.
- Junit 4의 @Before에 해당이 된다. 각 테스트 메서드 실행 전에 실행이 된다.
- Junit 4의 @After에 해당이 된다. 각 테스트 메서드 실행 후에 실행이 된다.
- Junit 4의 @AfterClass 처럼 현재 클래스의 모든 테스트 클래스가 끝나고 난 뒤에 실행이 되며 @BeforeAll과 동일하게 static이어야 한다.
gradle에서 무심코 dependencies 부분에서 궁금증
-
implementation , compileOnly, runtimeOnly, annotationProcessor, testImplementation, testCompileOnly, testRuntimeOnly, testAnnotationProcessor 시점차이
compileClasspath에서는 compileOnly와 implementation으로 접근이 가능 but 프로젝트가 컴파일 된 후에는 compileOnly가 소멸 (런타임시에 필요없는 경우 사용)
프로그램의 메모리 내에 적재되어 있는 메소드는 implementation 과 runtimeOnly의 두 가지 상태값
annotationProcessor의 경우 선언을 하게 되면 이 부분의 작업만 지켜보기 때문에 다른 연관되지 않은 부분에서 속도적 이득을 볼 수 있다고 합니다.
compileOnly의 경우 Gradle 2.12부터 지원을 했다. (Maven의 prvided와 비슷한 기능이라고 한다.) 이번 프로젝트의 gradle 버전은 6.6.1 annotationProcessor의 경우는 Gradle 4.6 부터
참조) https://blog.gradle.org/introducing-compile-only-dependencies, https://docs.gradle.org/2.12/userguide/java_plugin.html, https://docs.gradle.org/4.6/release-notes.html#convenient-declaration-of-annotation-processor-dependencies
implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' runtimeOnly 'com.h2database:h2' annotationProcessor 'org.projectlombok:lombok'
spring-boot-starter-web 패키지에 들어있는 클래스와 메서드들은 런타임시에도 살아있고, lombok은 런타임시에는 소멸이 되어있다. 이유는 lombok은 동작 기능이라기보다는 편의 기능이기에 축소된 메서드들을 컴파일 시에 풀어서 적용시켜준다.
@Slf4j public class AnnotationTest { static Object staticObject; Object object1;
롬복이 적용된 위의 코드를 컴파일 하고 .class 파일을 IntelliJ에서 살펴보면 아래와 같이 풀어져있는 것을 알 수 있다.
public class AnnotationTest { private static final Logger log = LoggerFactory.getLogger(AnnotationTest.class); static Object staticObject; Object object1; public AnnotationTest() { }
javap -c AnnotationTest.class ( java 컴파일러에서 -c 옵션을 붙여서 자세하게 )
Compiled from "AnnotationTest.java" public class com.example.junit.five.AnnotationTest { static java.lang.Object staticObject; java.lang.Object object1; public com.example.junit.five.AnnotationTest(); Code: 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return static {}; Code: 0: ldc #16 // class com/example/junit/five/AnnotationTest 2: invokestatic #17 // Method org/slf4j/LoggerFactory.getLogger:(Ljava/lang/Class;)Lorg/slf4j/Logger; 5: putstatic #2 // Field log:Lorg/slf4j/Logger; 8: return }