SlideShare a Scribd company logo
JUnit & AssertJ
JUnit & AssertJ
JUnit & AssertJ
JUnit & AssertJ
JUnit & AssertJ
JUnit & AssertJ
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
Maven
@Slf4j
public class Calculator {
/**
* 더하기
*
* @param nums 더하기 할 숫자들
* @return 합
*/
public double add(double... nums) {
log.trace("더하기... nums={}", nums);
double sum = 0.0;
for (double n : nums) {
sum += n;
}
log.debug("합={}", sum);
return sum;
}
}
@Slf4j
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
Assertions.assertThat(calculator.add(1, 2)).isEqualTo(3);
}
}
@Slf4j
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
assertThat(calculator.add(1, 2)).isEqualTo(3);
assertThat(calculator.add(-1, -2)).isEqualTo(-3);
assertThat(calculator.add()).isEqualTo(0);
}
}
JUnit & AssertJ
JUnit & AssertJ
Test Class
@Test
@Test
@Test
@Before
@BeforeClass
@AfterClass
@After
1
2
3
45 8
6
9
7 10
11
@Test(expected = AssertionError.class, timeout = 1000L)
public void testAddException() {
Calculator calculator = new Calculator();
assertThat(calculator.add(1, 2)).isEqualTo(5);
}
@Slf4j
public class JUnitAnnotationTest {
private static Calculator calc;
@BeforeClass
public static void setupClass() throws Exception {
log.debug("Before Class...");
calc = new Calculator();
Thread.sleep(100L);
}
@Before
public void setup() {
log.debug("Before ...");
}
@After
public void cleanup() {
log.debug("@After...");
}
@AfterClass
public static void cleanupClass() {
log.debug("After Class...");
}
@Test
public void test1() {
log.debug("test1");
assertThat(calc).isNotNull();
}
@Test
public void test2() {
log.debug("test2");
assertThat(calc).isNotNull();
}
}
2016-01-15 11:40:55,935 DEBUG k.k.java.study.JUnitAnnotationTest.setup : Before ...
2016-01-15 11:40:55,935 DEBUG k.k.java.study.JUnitAnnotationTest.test1 : test1
2016-01-15 11:40:55,960 DEBUG k.k.java.study.JUnitAnnotationTest.cleanup : @After...
2016-01-15 11:40:55,961 DEBUG k.k.java.study.JUnitAnnotationTest.setup : Before ...
2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.test2 : test2
2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.cleanup : @After...
Before Class...2016-01-15 11:40:55,831 DEBUG k.k.java.study.JUnitAnnotationTest.setupClass : Before Class...
2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.cleanupClass : After Class...
JUnit & AssertJ
JUnit & AssertJ
Hamcrest 사용 예
AssertJ Core features highlight
<dependency>
<groupId>org.assertj</groupId>
<artifactId>assertj-core</artifactId>
<version>3.2.0</version>
<scope>test</scope>
</dependency>
Maven
Gradle
testCompile ‘org.assertj.assertj-core:3.2.0’
ImportAssertions class
import static org.assertj.core.api.Assertions.*;
import static org.assertj.core.api.Assertions.assertThat; // Main Assertion
import static org.assertj.core.api.Assertions.atIndex; // 리스트 검증
import static org.assertj.core.api.Assertions.entry; // Map 검증
import static org.assertj.core.api.Assertions.tuple; // 클래스에서 속성 추출 시 사용
import static org.assertj.core.api.Assertions.fail; // 예외 검증 시 사용
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
import static org.assertj.core.api.Assertions.filter; // 컬렉션 필터링
import static org.assertj.core.api.Assertions.offset; // 부동소숫점 수형 관련
import static org.assertj.core.api.Assertions.anyOf; // 컨디션 적용
import static org.assertj.core.api.Assertions.contentOf; // 파일 관련 검증
assertThat(cfg.getDatabase()).isNotNull();
assertThat(cfg.getDatabase().getDriverClass().isPresent()).isTrue();
assertThat(cfg.getDatabase().getJdbcUrl().isPresent()).isTrue();
Offset<Double> offset = Assertions.offset(1.0e-8);
assertThat(valueOf("142.milligrams").inGram()).isEqualTo(milligram(142).inGram(), offset);
assertThat(valueOf("0.1.gram").inGram()).isEqualTo(gram(0.1).inGram(), offset);
assertThat(valueOf("10000.1.gram").inGram()).isEqualTo(gram(10000.1).inGram(), offset);
assertThat(valueOf("78.4.kilogram").inGram()).isEqualTo(kilogram(78.4).inGram(), offset);
assertThatThrownBy(() -> valueOf("100.bottles"))
.isInstanceOf(NumberFormatException.class);
assertThatThrownBy(() -> valueOf("100 gram"))
.isInstanceOf(NumberFormatException.class);
assertThatThrownBy(() -> valueOf("100.0.0.0.gram"))
.isInstanceOf(NumberFormatException.class);
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.fail;
import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown;
// ... 생략
assertThat(fellowshipOfTheRing).hasSize(9);
// 일반적으로 예외 발생에 대한 검증 처리
try {
fellowshipOfTheRing.get(9); // 예외 발생!!!
// 여기까지 코드가 오는 것은 기대했던 예외가 발생하지 않았다는 뜻! 검증 실패
fail("IndexOutOfBoundsException expected because fellowshipOfTheRing has only 9 elements");
} catch (IndexOutOfBoundsException e) {
assertThat(e).hasMessage("Index: 9, Size: 9");
}
// 주의점 : Throwable 로 catch 하면 안된다.
// 그러면 fail로 발생한 AssertionError 도 catch 해서 검증 성공으로 인식해 버린다.
// 다른 방식
try {
fellowshipOfTheRing.get(9); // 예외 발생!!
// 기대했던 예외가 발생하지 않았다는 뜻! 검증 실패
failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class);
} catch (IndexOutOfBoundsException e) {
assertThat(e).hasMessage("Index: 9, Size: 9");
}
With Java 7
@Test
public void testException() {
assertThatThrownBy(() -> { throw new Exception("boom!")
}).isInstanceOf(Exception.class)
.hasMessageContaining("boom");
}
With Java 8
@Test
public void testException() {
// given some preconditions
// …
// when
Throwable thrown = catchThrowable(() -> { throw new Exception("boom!") });
// then
assertThat(thrown).isInstanceOf(Exception.class) .hasMessageContaining("boom");
}
With Java 8 BDD
// 두 인스턴스가 같은 배우이고, 속성 중 종족 값만 같은 경우...
// fredo 와 sam 은 다른 사람이지만 같은 호빗족이다.
assertThat(frodo).isNotEqualTo(sam);
// raceComparator 가 Comparator<AClass> 이면서 race 값만 비교하는 경우
assertThat(frodo).usingComparator(raceComparator).isEqualTo(sam);
// 절대반지 그룹에 간달프는 속해있지만, 사우론은 아니다
assertThat(fellowshipOfTheRing).contains(gandalf).doesNotContain(sauron);
// 하지만 종족을 비교하는 raceComparator 를 사용하면 사우론도 간달프와 같은 Maia 종족이다.
assertThat(fellowshipOfTheRing)
.usingElementComparator(raceComparator)
.contains(sauron);
usingElementComparator(Comparator) example:
usingComparator(Comparator) example:

More Related Content

PDF
자바모델 클래스에 날개를달자_롬복(Lombok)
PDF
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
PDF
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
PPTX
스트림Api 소개
PDF
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
PDF
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
자바모델 클래스에 날개를달자_롬복(Lombok)
(스프링초보자를위한)스프링 컨텍스트 설정과 관련된 어노테이션
[#9.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)]_재직자환급교육/실업자환급교육/구로IT학원/스프링교...
스트림Api 소개
(IT실무교육/국비지원교육/자바/스프링교육추천)#15.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)
(스프링교육/마이바티스교육학원추천_탑크리에듀)#10.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)

What's hot (20)

PPTX
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
PPTX
Spring test mvc 발표자료
PDF
Perl Script Document
PPTX
스트림Api 스터디 2일
PDF
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
PDF
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
PDF
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리
PDF
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
PPTX
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
PDF
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
Backbone.js :tips & tricks
PDF
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
PDF
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
PDF
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
PDF
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
PDF
06.실행환경 실습교재(easy company,해답)
PDF
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
PDF
06.실행환경 실습교재(easy company,문제)
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
Spring test mvc 발표자료
Perl Script Document
스트림Api 스터디 2일
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
Backbone.js :tips & tricks
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
(Spring Data JPA)식별자(@Id, Primary Key) 자동 생성, @GeneratedValue의 strategy 속성,Ge...
06.실행환경 실습교재(easy company,해답)
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
06.실행환경 실습교재(easy company,문제)
Ad

Viewers also liked (12)

PDF
Showdown of the Asserts by Philipp Krenn
ODP
Property based-testing
PDF
"Design and Test First"-Workflow für REST APIs
ODP
Assertj-core
ODP
Illia Seleznov - Integration tests for Spring Boot application
ODP
Advanced junit and mockito
PDF
Test Driven Development
PPTX
Writing and using Hamcrest Matchers
PPTX
PDF
JUnit Kung Fu: Getting More Out of Your Unit Tests
PPTX
JUnit 5 - from Lambda to Alpha and beyond
PDF
Mocking in Java with Mockito
Showdown of the Asserts by Philipp Krenn
Property based-testing
"Design and Test First"-Workflow für REST APIs
Assertj-core
Illia Seleznov - Integration tests for Spring Boot application
Advanced junit and mockito
Test Driven Development
Writing and using Hamcrest Matchers
JUnit Kung Fu: Getting More Out of Your Unit Tests
JUnit 5 - from Lambda to Alpha and beyond
Mocking in Java with Mockito
Ad

Similar to JUnit & AssertJ (11)

PDF
시작하자 단위테스트
PPTX
10장 결과 검증
PDF
TDD with JUnit 2
PDF
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
PDF
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
PDF
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
PDF
자바 테스트 자동화
PDF
TDD.JUnit.조금더.알기
PPTX
Backend Master | 3.2.1 Test - JUnit
PPTX
120908 레거시코드활용전략 4장5장
PDF
Effective unit testing ch3. 테스트더블
시작하자 단위테스트
10장 결과 검증
TDD with JUnit 2
Advanced Python Testing Techniques (Pycon KR 2019) [Korean Ver.]
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
KSUG 스프링캠프 2019 발표자료 - "무엇을 테스트할 것인가, 어떻게 테스트할 것인가"
자바 테스트 자동화
TDD.JUnit.조금더.알기
Backend Master | 3.2.1 Test - JUnit
120908 레거시코드활용전략 4장5장
Effective unit testing ch3. 테스트더블

More from Sunghyouk Bae (16)

PDF
JUnit5 and TestContainers
PDF
Introduction of failsafe
PDF
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
PDF
Spring data requery
PDF
Requery overview
PDF
Kotlin @ Coupang Backend 2017
PDF
measure metrics
PDF
Alternatives of JPA/Hibernate
PPTX
Kotlin coroutines and spring framework
PPTX
Java naming strategy (자바 명명 전략)
PPTX
테스트자동화와 TDD
PPTX
SpringBoot with MyBatis, Flyway, QueryDSL
PPTX
좋은 개발자 되기
PDF
Using AdoRepository
PDF
Multithread pattern 소개
PDF
Strategy Maps
JUnit5 and TestContainers
Introduction of failsafe
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Spring data requery
Requery overview
Kotlin @ Coupang Backend 2017
measure metrics
Alternatives of JPA/Hibernate
Kotlin coroutines and spring framework
Java naming strategy (자바 명명 전략)
테스트자동화와 TDD
SpringBoot with MyBatis, Flyway, QueryDSL
좋은 개발자 되기
Using AdoRepository
Multithread pattern 소개
Strategy Maps

JUnit & AssertJ

  • 8. @Slf4j public class Calculator { /** * 더하기 * * @param nums 더하기 할 숫자들 * @return 합 */ public double add(double... nums) { log.trace("더하기... nums={}", nums); double sum = 0.0; for (double n : nums) { sum += n; } log.debug("합={}", sum); return sum; } } @Slf4j public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); Assertions.assertThat(calculator.add(1, 2)).isEqualTo(3); } } @Slf4j public class CalculatorTest { @Test public void testAdd() { Calculator calculator = new Calculator(); assertThat(calculator.add(1, 2)).isEqualTo(3); assertThat(calculator.add(-1, -2)).isEqualTo(-3); assertThat(calculator.add()).isEqualTo(0); } }
  • 12. @Test(expected = AssertionError.class, timeout = 1000L) public void testAddException() { Calculator calculator = new Calculator(); assertThat(calculator.add(1, 2)).isEqualTo(5); }
  • 13. @Slf4j public class JUnitAnnotationTest { private static Calculator calc; @BeforeClass public static void setupClass() throws Exception { log.debug("Before Class..."); calc = new Calculator(); Thread.sleep(100L); } @Before public void setup() { log.debug("Before ..."); } @After public void cleanup() { log.debug("@After..."); } @AfterClass public static void cleanupClass() { log.debug("After Class..."); } @Test public void test1() { log.debug("test1"); assertThat(calc).isNotNull(); } @Test public void test2() { log.debug("test2"); assertThat(calc).isNotNull(); } } 2016-01-15 11:40:55,935 DEBUG k.k.java.study.JUnitAnnotationTest.setup : Before ... 2016-01-15 11:40:55,935 DEBUG k.k.java.study.JUnitAnnotationTest.test1 : test1 2016-01-15 11:40:55,960 DEBUG k.k.java.study.JUnitAnnotationTest.cleanup : @After... 2016-01-15 11:40:55,961 DEBUG k.k.java.study.JUnitAnnotationTest.setup : Before ... 2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.test2 : test2 2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.cleanup : @After... Before Class...2016-01-15 11:40:55,831 DEBUG k.k.java.study.JUnitAnnotationTest.setupClass : Before Class... 2016-01-15 11:40:55,962 DEBUG k.k.java.study.JUnitAnnotationTest.cleanupClass : After Class...
  • 19. ImportAssertions class import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.assertThat; // Main Assertion import static org.assertj.core.api.Assertions.atIndex; // 리스트 검증 import static org.assertj.core.api.Assertions.entry; // Map 검증 import static org.assertj.core.api.Assertions.tuple; // 클래스에서 속성 추출 시 사용 import static org.assertj.core.api.Assertions.fail; // 예외 검증 시 사용 import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; import static org.assertj.core.api.Assertions.filter; // 컬렉션 필터링 import static org.assertj.core.api.Assertions.offset; // 부동소숫점 수형 관련 import static org.assertj.core.api.Assertions.anyOf; // 컨디션 적용 import static org.assertj.core.api.Assertions.contentOf; // 파일 관련 검증
  • 20. assertThat(cfg.getDatabase()).isNotNull(); assertThat(cfg.getDatabase().getDriverClass().isPresent()).isTrue(); assertThat(cfg.getDatabase().getJdbcUrl().isPresent()).isTrue(); Offset<Double> offset = Assertions.offset(1.0e-8); assertThat(valueOf("142.milligrams").inGram()).isEqualTo(milligram(142).inGram(), offset); assertThat(valueOf("0.1.gram").inGram()).isEqualTo(gram(0.1).inGram(), offset); assertThat(valueOf("10000.1.gram").inGram()).isEqualTo(gram(10000.1).inGram(), offset); assertThat(valueOf("78.4.kilogram").inGram()).isEqualTo(kilogram(78.4).inGram(), offset); assertThatThrownBy(() -> valueOf("100.bottles")) .isInstanceOf(NumberFormatException.class); assertThatThrownBy(() -> valueOf("100 gram")) .isInstanceOf(NumberFormatException.class); assertThatThrownBy(() -> valueOf("100.0.0.0.gram")) .isInstanceOf(NumberFormatException.class);
  • 21. import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; // ... 생략 assertThat(fellowshipOfTheRing).hasSize(9); // 일반적으로 예외 발생에 대한 검증 처리 try { fellowshipOfTheRing.get(9); // 예외 발생!!! // 여기까지 코드가 오는 것은 기대했던 예외가 발생하지 않았다는 뜻! 검증 실패 fail("IndexOutOfBoundsException expected because fellowshipOfTheRing has only 9 elements"); } catch (IndexOutOfBoundsException e) { assertThat(e).hasMessage("Index: 9, Size: 9"); } // 주의점 : Throwable 로 catch 하면 안된다. // 그러면 fail로 발생한 AssertionError 도 catch 해서 검증 성공으로 인식해 버린다. // 다른 방식 try { fellowshipOfTheRing.get(9); // 예외 발생!! // 기대했던 예외가 발생하지 않았다는 뜻! 검증 실패 failBecauseExceptionWasNotThrown(IndexOutOfBoundsException.class); } catch (IndexOutOfBoundsException e) { assertThat(e).hasMessage("Index: 9, Size: 9"); } With Java 7
  • 22. @Test public void testException() { assertThatThrownBy(() -> { throw new Exception("boom!") }).isInstanceOf(Exception.class) .hasMessageContaining("boom"); } With Java 8 @Test public void testException() { // given some preconditions // … // when Throwable thrown = catchThrowable(() -> { throw new Exception("boom!") }); // then assertThat(thrown).isInstanceOf(Exception.class) .hasMessageContaining("boom"); } With Java 8 BDD
  • 23. // 두 인스턴스가 같은 배우이고, 속성 중 종족 값만 같은 경우... // fredo 와 sam 은 다른 사람이지만 같은 호빗족이다. assertThat(frodo).isNotEqualTo(sam); // raceComparator 가 Comparator<AClass> 이면서 race 값만 비교하는 경우 assertThat(frodo).usingComparator(raceComparator).isEqualTo(sam); // 절대반지 그룹에 간달프는 속해있지만, 사우론은 아니다 assertThat(fellowshipOfTheRing).contains(gandalf).doesNotContain(sauron); // 하지만 종족을 비교하는 raceComparator 를 사용하면 사우론도 간달프와 같은 Maia 종족이다. assertThat(fellowshipOfTheRing) .usingElementComparator(raceComparator) .contains(sauron); usingElementComparator(Comparator) example: usingComparator(Comparator) example: