seong
Junit - Dao 테스트 본문
finAll_test
package site.metacoding.firstapp.domain.product;
import static org.junit.jupiter.api.Assertions.assertEquals;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.context.annotation.Import;
import site.metacoding.firstapp.config.MyBatisConfig;
//SpringBootTest 모든것을 다 메모리에 띄움
//Vscode에서 import 자동 입력 키 : alt + shift + o
@Import(MyBatisConfig.class) // MyBatisTest가 MyBatisConfig를 못읽음 , 강제로 import해줌
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 실DB사용,
@MybatisTest
public class ProductDaoTest {
// 단위 테스트는 생성자 주입이 안된다.
// 외부에서 주입할때 빈 생성자만 주입해준다. -> 생성자 주입이 되지 않는다.
@Autowired
private ProductDao productDao;
// test는 절대 return이 안된다 void사용
@Test
public void findById_test() {
// given - 받아야 할 것 ex) delete에선 id가 필요하다 id를 임의로 준다
Integer productId = 1;
// when - 테스트
Product productPS = productDao.findById(productId);
// then - 검증
assertEquals("바나나", productPS.getProductName());
}
@Test
public void findAll() {
//given - findAll 메서드의 given데이터는 없음.
//when
List<Product> productListPS = productDao.findAll();
System.out.println(productListPS.get(0).getProductName());
//then
assertEquals(2, productListPS.size());
}
}
객체의 사이즈크기를 비교해서 findAll이 잘 되었는지 확인 -> 성공
insert_test
insert할 때 알 수 있는 점
resultset을 자바 Entity로 변경해줄때 빈생성자만 호출하고 Setter가 없어도 알아서 맵핑해준다.
Mybatis는자바의 엔티티로 변환해서 넣어주는 역할도 해준다.
만약 private로 만들어놓고 해도 정상적으로 실행이 될까
정상적으로 실행이 된다.
그럼 여기서 알수 있는 점
- private가 걸려있으면 원래 접근이 안된다. 하지만Mybatis는 private가 걸려있어도 빈생성자를 알아서 호출해준다!
insert 리턴값 int로 주고 잘 들어갔는지 확인하기
assert함수 써서 확인
update_test
update는 수정 값은 3개이지만 WHERE절에 id가 필요하다.
그래서 update는 given데이터를 selete해서 넣는다
혹시나 junit에서 syso로 출력이 필요할 경우 필터링 넣기
delete_test()
verify 과정이 중요하다!
데이터가 없는데 삭제가 되면 안되기 때문에 꼭 영속화해서 데이터가 있는지 확인 해야함
전체 코드
package site.metacoding.firstapp.domain.product;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.mybatis.spring.boot.test.autoconfigure.MybatisTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.context.annotation.Import;
import site.metacoding.firstapp.config.MyBatisConfig;
//SpringBootTest 모든것을 다 메모리에 띄움
//Vscode에서 import 자동 입력 키 : alt + shift + o
@Import(MyBatisConfig.class) // MyBatisTest가 MyBatisConfig를 못읽음 , 강제로 import해줌
@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE) // 실DB사용,
@MybatisTest
public class ProductDaoTest {
// 단위 테스트는 생성자 주입이 안된다.
// 외부에서 주입할때 빈 생성자만 주입해준다. -> 생성자 주입이 되지 않는다.
@Autowired
private ProductDao productDao;
// test는 절대 return이 안된다 void사용
@Test
public void findById_test() {
// given - 받아야 할 것 ex) delete에선 id가 필요하다 id를 임의로 준다
Integer productId = 1;
// when - 테스트
Product productPS = productDao.findById(productId);
// then - 검증
assertEquals("바나나", productPS.getProductName());
}
@Test
public void findAll_test() {
List<Product> productListPS = productDao.findAll();
System.out.println(productListPS.get(0).getProductName());
assertEquals(2, productListPS.size());
}
// Mybatis는 ResultSet을 자바 Entity로 변경해줄때 , 빈생성자를 호출하고 setter가 없어도 매핑해준다.
// setter을 걸어줄 필요가 없다.
@Test
public void insert_test() {
// given
String productName = "수박"; // 데이터의 일관성을 위해 생성해서 넘겨줌.
Integer productPrice = 1000;
Integer productQty = 100;
// when
// insert 의도를 정확하게 하려고 3개가 있는 생성자를 일부러 만들어줌
// Junit은 메서드 실행전에 트랜젝션이 걸리고, 메서드 실행이 끝나면rollback가 된다. -> 스택안에서만 놀고 끝남.
Product product = new Product(productName, productPrice, productQty);
int result = productDao.insert(product);
// then
assertEquals(1, result);
}
@Test
public void update_test() {
// given
Integer productId = 1;
String productName = "수박";
Integer productPrice = 1000;
Integer productQty = 100;
Product product = new Product(productName, productPrice, productQty);
product.setProductId(productId);
// verify 영속화
Product productPS = productDao.findById(product.getProductId());
assertTrue(product == null ? false : true);
// when
productPS.update(product);
int result = productDao.update(productPS);
// then
assertEquals(1, result);
}
@Test
public void delete_test() {
// given
Integer productId = 1;
// verify
Product product = productDao.findById(productId);
System.out.println("product id :" + product.getProductId());
System.out.println("product 이름 :" + product.getProductName());
System.out.println("product 가격 :" + product.getProductPrice());
System.out.println("product 수량 :" + product.getProductQty());
assertTrue(product == null ? false : true);
// when
int result = productDao.deleteById(productId);
// then
assertEquals(1, result);
}
}
'Junit' 카테고리의 다른 글
Junit 통합 테스트 하기 위한 팁 (0) | 2022.10.28 |
---|---|
Junit이란? 메서드 테스트 해보기 (0) | 2022.09.29 |
VsCode 설정 - 저장시 자동정렬, Intellij 키보드 설정 적용시키기 (0) | 2022.09.29 |
Junit 프로젝트 실행 시키기 (2) - 기본 셋팅 (0) | 2022.09.29 |
Junit - Vscode로 STS 프로젝트 실행에 필요한 확장프로그램 설치(1) (0) | 2022.09.29 |