전체 글 280

classicist vs mockist

classicist: 최대한 mock을 사용하지 않는다.mockist: 단위 테스트로 테스트를 이미 진행했으므로 mock사용을 권장한다. classicist 입장에선 레파지토리 테스트를 진행하고 서비스 테스트는 레파지토리와 통합해서 통합 테스트를 진행하고 컨트롤러 테스트는 서비스와 레파지토리를 mock처리해서 테스트를 한다. 또한 외부 시스템인 경우 mock처리를 해서 테스트를 한다.

TestCode 2024.07.17

Mockito.verify

Mockito.verify는 Java에서 가장 널리 사용되는 모의(mocking) 프레임워크인 Mockito에서 사용되는 메서드이다. 이 메서드는 테스트 중에 모의 객체가 특정 메서드를 호출했는지, 얼마나 자주 호출했는지 등을 검증하는 데 사용할 수 있다. 이를 통해 작성한 코드가 예상대로 동작하는지 확인할 수 있다. Mockito.verify(mailSendHistoryRepository, times(1)).save(any(MailSendHistory.class)); 위 코드는 mailSendHistoryRepository의 save함수가 1번 호출되었음을 테스트하는 코드이다.

TestCode 2024.07.16

Mock 사용하기 (@Mock, @InjectMocks, @Spy)

개요MockBean을 사용하면 스프링 컨테이너의 빈이 MockBean으로 대체되어 사용된다. 이와 반대로 단위 테스트를 진행하기 위해 스프링 컨테이너를 실행하기엔 무거울 수 있어 Mock을 사용한다.즉 Mock은 스프링과 무관하며, 그저 단순한 Mock객체를 만들어주는 어노테이션이기 때문에 스프링 컨텍스트에는 실제 객체가 Bean으로 남아있게 된다. 사용법1. 아래의 코드와 같이 Mock을 만들 클래스 타입을 Mockito.mock의 인자로 넣어주면 된다.MailSendClient = mailSendClient = Mockito.mock(MilSendClient.class);MailService mailService = new MailSerivce(mailSendClient);when(mailSendCl..

TestCode 2024.07.16

JUnit 예외 상황 테스트 하기

개요테스트를 진행할 때 예외를 던지는 케이스에 대해 JUnit을 사용해서 테스트를 진행하는 방법을 알아보자 방법 import static org.assertj.core.api.Assertions.assertThatThrownBy;assertthatTrownBy를 import 한다.assertThatThrownBy(() -> stock.deductQuantity(quantity)) .isInstanceOf(IllegalArgumentException.class) .hasMessage("차감할 재고 수량이 없습니다.");위 코드와 같이 stock.deductQuantity를 호출했을 때 만약 예외를 던지는 경우 isInstanceOf를 사용해서 예외를 체크하고 hasMessage를 ..

TestCode 2024.07.15

JUnit 객체의 필드 값 확인하기

개요테스트 코드를 작성하다 보면 데이터베이스에 값이 잘 저장되었는지 확인하기 위해 repository에서 객체를 로드해고 테스트해야 하는 경우 객체의 필드 값을 테스트해보고 싶은 때 방법을 알아보기 위해 작성하게 되었다. 방법 아래의 코드는 stockRepository에서 저장되어 있는 모든 stocks를 조회하고 그 중 productNumber, quantity의 필드 값을 확인해 보려고 한다. 이때 extracting을 사용해 필드 값을 추출한 뒤 containsExactlyInAnyOrder를 사용해서 순서와 상관없이 두 개의 tuple을 가지고 있으면 통과한다. List stocks = stockRepository.findAll();assertThat(stocks).hasSize(2) ..

TestCode 2024.07.15

[백준] 학교 탐방하기 (python)

출처 : https://www.acmicpc.net/problem/13418 풀이 방법union-find알고리즘을 통해 해결할 수 있다. 기존의 알고리즘과 다른 점은 0에서 1로 가는 간선은 무조건 포함되어야 한다는 점이다. 또 가장 힘든 경우와 가장 덜 힘든 경우를 계산하기 위해 mst알고리즘을 2번 사용했다.주의: mst알고리즘을 사용하기 전 parents를 초기화해주어야 한다.  N, M = map(int, input().split())edges = []parents = [ i for i in range(N+1)]a, b, c = map(int, input().split()) ## 0~1 엣지 무조건 추가되어야 할 edgefirst_weight = 1 - c ## 첫 번째 edge의 weight 오..

Algorithm 2024.07.15

[백준] 최소 스패닝 트리 (python)

출처 : https://www.acmicpc.net/problem/1197 풀이 방법kruskal 알고리즘을 사용해서 풀이할 수 있었다.kruskal 알고리즘을 이용하기 위해 union find 알고리즘을 구현해야 한다.입력을 받을 때 간선(edges)을 기준으로 입력을 받는다.그 후 edges의 weight가 작은 것으로 정렬을 한다.weight가 작은 간선 중  간선에 연결된 두 노드의 부모가 같지 않다면 해당 간선을 추가한다.간선이 V-1개가 될 때까지 반복한다. V , E = map(int, input().split())parents = [i for i in range(V+1)] ## 부모 배열 생성edges = []for i in range(E): ## 입력 받기 a, b, w = map..

Algorithm 2024.07.14

Mockito 사용하기

개요컨트롤러를 테스트할 때 서비스로직을 이용해야 할 때가 있다 이때 Mockito를 사용하자 방법1. 사용할 서비스를 MockBean으로 등록한다.@MockBean // 컨테이너에 mock으로 만든 객체를 넣어준다.private ProductService productService; 2. 테스트 로직에서 mockBean의 동작 방법을 when을 사용해서 정한다.List result = List.of();when(productService.getSellingProducts()).thenReturn(result);현재 테스트에서 productService의 getSellingProducts를 호출하면 result를 반환한다. 3. 테스트를 작성한다.이때 객체를 Json으로 변환해 주기 위해 objectMap..

TestCode 2024.07.13

RSA 공개키 알고리즘

공개키 알고리즘인 RSA 알고리즘에 대해 알아보자 Public key키를 2개 사용한다public key (공개)private key (비공개)비대칭 알고리즘이다.활용서명A의 비밀키로 암호화 한 메시지를 공개키를 가진 B가 복호화를 하면 A의 메시지인 것을 알 수 있다.메시지 암호화 및 복호화메시지를 암호화 및 복호화하여 통신을 위해 사용할 수 있지만 대칭키 알고리즘 방식보다 느리므로 잘 안 쓴다.키 분배대칭키 알고리즘의 key를 분배하는 데 사용한다.공개키 암호 알고리즘이 가져야 하는 기본적인 특성알고리즘, 공개 키만 가지고 복호화 키를 찾는 것은 계산적으로 불가능키만 있으면 암복호화가 쉬워야 한다.하나의 key로 암호화했으면 다른 key로 복호화한다.RSA 알고리즘RSA알고리즘은 큰 두 소수의 곱 N..

보안 2024.07.01

컨트롤러 테스트하기

컨트롤러외부 세계의 요청을 가장 먼저 받는 계층파라미터에 대한 최소한의 검증을 수행하는 것을 목표로 한다.Business Layer, Persistence Layer를 Mocking 해서 테스트를 해보자.실습ProductController에 대해 TestCode를 작성해 보자@WebMvcTest(controllers = ProductController.class) 어노테이션을 사용해 ProductController와 관련된 빈만 로드하여 최소한의 빈만 로드한다.가짜 객체인 Mock객체를 주입받기 위해 @MockBean을 이용해 private ProductService를 선언해 준다.MockMvc를 주입받기 위해 @Autowired를 통해 주입받는다MockMvc 객체를 통해 컨트롤러의 요청과 응답을 실제 ..

TestCode 2024.06.30