일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 스프링 핵심 원리
- Spring Boot
- QueryDSL
- 스프링 핵심 기능
- pointcut
- kotlin
- java
- springdatajpa
- 자바
- Proxy
- SpringBoot
- 인프런
- transaction
- Servlet
- 그리디
- Android
- 알고리즘
- AOP
- Exception
- http
- db
- spring
- Thymeleaf
- 김영한
- 백준
- JDBC
- Greedy
- JPQL
- 스프링
- jpa
- Today
- Total
개발자되기 프로젝트
Junit-1 본문
Junit이란? 자바용 단위 테스트 도구!
* TDD(Test-driven Development)
테스트 주도 개발에서 사용하지만, 코드의 유지 보수 및 운영 환경에서의 에러를 미리 방지하기 위해서 다누이 별로 검증하는 테스트 프레임워크를 말함
* 단위 테스트
작성한 코드가 기대하는 대로 동작하는지 검증
* JUnit 자바 기반의 단위 테스트를 위한 프레임 워크
Annotation을 기반으로 테스트 지원, Assert를 통해 (예상, 실제) 검증
* Assertion : 가정 설정문, 참 거짓을 미리 가정하는 문.
JUnit을 사용하기 위해서는 dependency에 아래와 같이 추가되어 있어야 함!
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
JUnit 사용 연습을 위해 다음과 같이 프로젝트를 구성할 것이다.
1. interface ICalculator : sum, minus 기능 표기?
public interface ICalculator {
int sum(int x, int y);
int minus(int x, int y);
}
2. class MarkerAPi : 대충 환율 불러오는 기능
public class MarketApi {
public int connect(){
return 1100;
}
}
3. class DollarCalculator implements ICalculator
public class DollarCalculator implements ICalculator{
private int price = 1;
private MarketApi marketApi;
//외부로부터 주입받자.
public DollarCalculator(MarketApi marketApi){
this.marketApi = marketApi;
}
public void init(){
this.price = marketApi.connect();
}
@Override
public int sum(int x, int y) {
x *=price;
y*=price;
return x+y;
}
@Override
public int minus(int x, int y) {
x *=price;
y*=price;
return x-y;
}
}
4. class KrwCalculator implements ICalculator : 원화로 기능
public class KrwCalculator implements ICalculator{
private int price = 1;
@Override
public int sum(int x, int y) {
x *=price;
y *=price;
return x+y;
}
@Override
public int minus(int x, int y) {
x *=price;
y *=price;
return x-y;
}
}
5. class Calculator : calculator에 dollarCalculator를 주입하거나, KrwCalculator 주입하여 사용
public class Calculator {
private ICalculator iCalculator;
public Calculator(ICalculator iCalculator){
this.iCalculator = iCalculator;
}
public int sum(int x, int y){
return this.iCalculator.sum(x, y);
}
public int minus(int x, int y){
return this.iCalculator.minus(x, y);
}
}
6 class Main : 대충 계산기 사용하는 코드
public class Main {
public static void main(String[] args) {
System.out.println("hello Junit");
MarketApi marketApi = new MarketApi();
DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
dollarCalculator.init();
//calcualtor에 dollarCalculator 주입
Calculator calculator = new Calculator(dollarCalculator);
System.out.println(calculator.sum(10,10));
}
}
이렇게 Main에서 코드를 구성하고 시행하여 에러를 찾을 수 도 있지만....test를 만들어서 찾아봅시다!!
7. test 만들기
테스트를 하기 원하는 method에 @Test를 붙여줘야 한다.
@Test
public void testHello(){
System.out.println("test hello");
}
8. 내가 예상하는 값으로 나오는지 확인하는 방법! : Assertion.assertEquals(예상 값, method)
Assertions.assertEquals(22000, calculator.sum(10,10))
: clculator.sum(10, 10)을 수행한 결과가 22000이랑 같음???
@Test
public void dollarTest(){
MarketApi marketApi = new MarketApi();
DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
dollarCalculator.init();
Calculator calculator = new Calculator(dollarCalculator);
System.out.println(calculator.sum(10,10));
Assertions.assertEquals(22000, calculator.sum(10,10));
Assertions.assertEquals(0, calculator.minus(10,10));
}
결과가 일치하면 콘솔 창에서 통과했다고 알려준당.
9. @Mock
marketApi는 환율을 가져오는 기능을 제공한다. 근데 환율을 계속 변하는데..????
환율에 계속 달라져도 method들이 잘 작동하는 지 확인하고 싶어.. @Mock을 사용하자.
목업을 만드는 것 처럼 객체도 목업을 만들 수 있다. 즉 가짜 객체? 모의객체를 @Mock을 통해 만들 수 있다.
mocking처리를 하자! 이를 위해서는 class에 @ExtendWith(Mockito)를 붙여줘야 하고
dependency 에 아래와 같이 추가해줘야 함.
testImplementation group: 'org.mockito', name: 'mockito-core', version: '3.10.0'
testImplementation group: 'org.mockito', name: 'mockito-junit-jupiter', version: '3.10.0'
테스트 코드를 작성해보자.
@ExtendWith(MockitoExtension.class)
public class DollarCalculatorTest {
@Mock //marketApi객체 mocking처리!
public MarketApi marketApi;
@BeforeEach //테스트 실행되기 이전에
public void init(){
Mockito.lenient().when(marketApi.connect()).thenReturn(3000);//.connect가 호출이 될때 3000으로 리턴
}
@Test
public void mockTest(){
DollarCalculator dollarCalculator = new DollarCalculator(marketApi);
dollarCalculator.init();
Calculator calculator = new Calculator(dollarCalculator);
System.out.println(calculator.sum(10,10));
Assertions.assertEquals(60000, calculator.sum(10,10));
Assertions.assertEquals(0, calculator.minus(10,10));
}
}
* @BeforeEach : 각 test실행되기 전에 실행되게 해줌.
@BeforeEach is used to signal that the annotated method should be executed before each @Test,
@RepeatedTest, @ParameterizedTest, @TestFactory, and @TestTemplate method in the current test class.
'Spring Boot' 카테고리의 다른 글
Swagger (0) | 2021.05.30 |
---|---|
Mock MVC (0) | 2021.05.22 |
Lombok (0) | 2021.05.22 |
JUnit-3 : Jacoco (0) | 2021.05.22 |
JUnit-2(spring, lombok 활용) (0) | 2021.05.22 |