SlideShare ist ein Scribd-Unternehmen logo
1 von 23
<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);
}
}
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...
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:

Weitere ähnliche Inhalte

Was ist angesagt?

(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육
(SQL초보자를 위한, 쿼리최적화 for SQL튜닝)SQL쿼리작성Tip,최적화팁,최적화된SQL작성방법교육탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Spring test mvc 발표자료
Spring test mvc 발표자료Spring test mvc 발표자료
Spring test mvc 발표자료수홍 이
 
Perl Script Document
Perl Script DocumentPerl Script Document
Perl Script Document오석 한
 
스트림Api 스터디 2일
스트림Api 스터디   2일스트림Api 스터디   2일
스트림Api 스터디 2일ByungSun Park
 
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#19.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...
#12.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_구로IT학원, 국비지원학원,재직자/실업자교육학원,스...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#22.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리
RxAndroid: 비동기 및 이벤트 기반 프로그래밍을 위한 라이브러리Soyeon Kim
 
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#16.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[자바학원/스프링교육학원/마이바티스학원추천/구로IT학원_탑크리에듀]#7.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...
(쿼리 변환, Query Transformation,서브쿼리푸시,SubQuery Pushing)SQL튜닝을 위해 서브쿼리의 드라이빙을 제어...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#20.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Backbone.js :tips & tricks
Backbone.js :tips & tricksBackbone.js :tips & tricks
Backbone.js :tips & tricksDaehyeon Shin
 
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...
#33.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_스프링프레임워크 강좌, 재직자환급교육,실업자국비지원...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...
[국비지원교육/재직자/실업자환급교육/IT실무학원추천/스프링교육추천]#5.스프링프레임워크 & 마이바티스 (Spring Framework, M...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
06.실행환경 실습교재(easy company,해답)
06.실행환경 실습교재(easy company,해답)06.실행환경 실습교재(easy company,해답)
06.실행환경 실습교재(easy company,해답)Hankyo
 
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천
#2.SQL초보에서 Schema Objects까지_재직자/근로자환급/국비지원교육/IT실무교육/SQL기초교육/구로IT학원추천탑크리에듀(구로디지털단지역3번출구 2분거리)
 
06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)06.실행환경 실습교재(easy company,문제)
06.실행환경 실습교재(easy company,문제)Hankyo
 

Was ist angesagt? (20)

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

Andere mochten auch

Showdown of the Asserts by Philipp Krenn
Showdown of the Asserts by Philipp KrennShowdown of the Asserts by Philipp Krenn
Showdown of the Asserts by Philipp KrennJavaDayUA
 
Property based-testing
Property based-testingProperty based-testing
Property based-testingfbenault
 
"Design and Test First"-Workflow für REST APIs
"Design and Test First"-Workflow für REST APIs"Design and Test First"-Workflow für REST APIs
"Design and Test First"-Workflow für REST APIsMarkus Decke
 
Assertj-core
Assertj-coreAssertj-core
Assertj-corefbenault
 
Illia Seleznov - Integration tests for Spring Boot application
Illia Seleznov - Integration tests for Spring Boot applicationIllia Seleznov - Integration tests for Spring Boot application
Illia Seleznov - Integration tests for Spring Boot applicationAnna Shymchenko
 
Advanced junit and mockito
Advanced junit and mockitoAdvanced junit and mockito
Advanced junit and mockitoMathieu Carbou
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Developmentjakubkoci
 
Writing and using Hamcrest Matchers
Writing and using Hamcrest MatchersWriting and using Hamcrest Matchers
Writing and using Hamcrest MatchersShai Yallin
 
JUnit Kung Fu: Getting More Out of Your Unit Tests
JUnit Kung Fu: Getting More Out of Your Unit TestsJUnit Kung Fu: Getting More Out of Your Unit Tests
JUnit Kung Fu: Getting More Out of Your Unit TestsJohn Ferguson Smart Limited
 
JUnit 5 - from Lambda to Alpha and beyond
JUnit 5 - from Lambda to Alpha and beyondJUnit 5 - from Lambda to Alpha and beyond
JUnit 5 - from Lambda to Alpha and beyondSam Brannen
 
Mocking in Java with Mockito
Mocking in Java with MockitoMocking in Java with Mockito
Mocking in Java with MockitoRichard Paul
 

Andere mochten auch (12)

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

Ähnlich wie JUnit & AssertJ

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅NAVER D2
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증dagri82
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기Heo Seungwook
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)Suwon Chae
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple OverviewKim Hunmin
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development지수 윤
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수NAVER D2
 
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합NAVER D2
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initializationEunjoo Im
 
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Donghyeok Kang
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overviewyongwoo Jeon
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍Young-Beom Rhee
 
구글테스트
구글테스트구글테스트
구글테스트진화 손
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화Sungchul Park
 

Ähnlich wie JUnit & AssertJ (20)

[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅[D2 오픈세미나]5.robolectric 안드로이드 테스팅
[D2 오픈세미나]5.robolectric 안드로이드 테스팅
 
10장 결과 검증
10장 결과 검증10장 결과 검증
10장 결과 검증
 
C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기C++ 프로젝트에 단위 테스트 도입하기
C++ 프로젝트에 단위 테스트 도입하기
 
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
테스트 가능한 소프트웨어 설계와 TDD작성 패턴 (Testable design and TDD)
 
Es2015 Simple Overview
Es2015 Simple OverviewEs2015 Simple Overview
Es2015 Simple Overview
 
Clean Front-End Development
Clean Front-End DevelopmentClean Front-End Development
Clean Front-End Development
 
One-day-codelab
One-day-codelabOne-day-codelab
One-day-codelab
 
Spring Boot 2
Spring Boot 2Spring Boot 2
Spring Boot 2
 
Basic git-commands
Basic git-commandsBasic git-commands
Basic git-commands
 
[115] clean fe development_윤지수
[115] clean fe development_윤지수[115] clean fe development_윤지수
[115] clean fe development_윤지수
 
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
제 5회 Lisp 세미나 - 클로저 개발팀을 위한 지속적인 통합
 
Swift3 subscript inheritance initialization
Swift3 subscript inheritance initializationSwift3 subscript inheritance initialization
Swift3 subscript inheritance initialization
 
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
Java Annotation과 MyBatis로 나만의 ORM Framework을 만들어보자
 
EcmaScript6(2015) Overview
EcmaScript6(2015) OverviewEcmaScript6(2015) Overview
EcmaScript6(2015) Overview
 
Scala for play
Scala for playScala for play
Scala for play
 
Redux
ReduxRedux
Redux
 
Nest js 101
Nest js 101Nest js 101
Nest js 101
 
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
스파르탄스터디 E04 Javascript 객체지향, 함수형 프로그래밍
 
구글테스트
구글테스트구글테스트
구글테스트
 
자바 테스트 자동화
자바 테스트 자동화자바 테스트 자동화
자바 테스트 자동화
 

Mehr von Sunghyouk Bae

JUnit5 and TestContainers
JUnit5 and TestContainersJUnit5 and TestContainers
JUnit5 and TestContainersSunghyouk Bae
 
Introduction of failsafe
Introduction of failsafeIntroduction of failsafe
Introduction of failsafeSunghyouk Bae
 
Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018Kotlin @ Coupang Backed - JetBrains Day seoul 2018
Kotlin @ Coupang Backed - JetBrains Day seoul 2018Sunghyouk Bae
 
Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Kotlin @ Coupang Backend 2017
Kotlin @ Coupang Backend 2017Sunghyouk Bae
 
Alternatives of JPA/Hibernate
Alternatives of JPA/HibernateAlternatives of JPA/Hibernate
Alternatives of JPA/HibernateSunghyouk Bae
 
Kotlin coroutines and spring framework
Kotlin coroutines and spring frameworkKotlin coroutines and spring framework
Kotlin coroutines and spring frameworkSunghyouk Bae
 
Java naming strategy (자바 명명 전략)
Java naming strategy (자바 명명 전략)Java naming strategy (자바 명명 전략)
Java naming strategy (자바 명명 전략)Sunghyouk Bae
 
테스트자동화와 TDD
테스트자동화와 TDD테스트자동화와 TDD
테스트자동화와 TDDSunghyouk Bae
 
SpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSpringBoot with MyBatis, Flyway, QueryDSL
SpringBoot with MyBatis, Flyway, QueryDSLSunghyouk Bae
 
좋은 개발자 되기
좋은 개발자 되기좋은 개발자 되기
좋은 개발자 되기Sunghyouk Bae
 
Multithread pattern 소개
Multithread pattern 소개Multithread pattern 소개
Multithread pattern 소개Sunghyouk Bae
 

Mehr von Sunghyouk Bae (16)

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

JUnit & AssertJ

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 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); } }
  • 9.
  • 10.
  • 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...
  • 14.
  • 15.
  • 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: