본문 바로가기

TIL

[TIL] 🌱 2023.03.27 - Rest Client Test

🛹 목표

목표 난이도 달성 여부
토비 스프링 🥺 ✔️
이펙티브 자바 ITEM 10, 11
- equals는 일반 규약을 지켜 재정의하라
- equals를 재정의하려거든 hashcode도 재정의하라 
🥺 ✔️
패스트 캠퍼스 강의 듣기 😘 ✔️
알골리즘 문제풀이 🥺 ✔️

📋 공부 내용 & 기록

1. 자바 equals메서드의 구현 방법

  1. == 연산자를 사용해 입력이 자기 자신의 참조인지 확인한다.
  2. instanceof 연산자로 입력이 올바른 타입인지 확인
  3. 입력을 올바른 타입으로 형변환
  4. 입력 객체와 자기 자신의 대응되는 `핵심` 필드들이 모두 일치하는지 하나씩 검사
@Override
public boolean equals(Object o) {
	if (o == this)
    	return true;
    if (!(o instanceof PhoneNumber))
    	return false;
    PhoneNumber pn = (PhoneNumber) o;
    return pn.lineNum == lineNum && pn.prefix == prefix && pn.areaCode == areaCode;
}

그 외 주의사항

  • float와 double을 제외한 기본 타입 필드는 == 연산자로 비교하고, 참조타입 필드는 각각의 equals 메서드로, float와 double은 각각 Float.compare(float, float), Double.compare(double, double)로 비교한다.
  • equals를 구현했다면 대칭적인지, 추이성이 있는지, 일관적인지 생각해보자.
    • 대칭성 : null이 아닌 모든 참조 값 x, y에 대해 x.equals(y)가 true이면, y.equals(x)도 true다.
    • 추이성 : null이 아닌 모든 참조 값 x, y, z에 대해 x.equals(y)가 true이고 y.eqauls(z)가 true면 x.equals(z)도 true다.
    • 일관성 : null이 아닌 모든 참조 값 x, y에 대해 x.equals(y)를 반복해서 호출하면 항상 true를 반환하거나, 항상 false를 반환한다.
  • equals를 재정의할 땐 hashcode도 반드시 재정의하자

 

 

2. Mockito VS BDD Mockito

 

Mockito와 BDDMockito는 뭐가 다를까?

이 글은 우아한테크코스 리뷰 페이지에 함께 게시된 글입니다. 해당 게시글은 JUnit5.x를 기준으로 작성되었습니다. 우아한테크코스 레벨2 미션 중에 의문이 생긴 적이 있었다.

velog.io

Mockito

  • Mockito는 의존성을 가지는 객체들을 가짜 객체로 만들어 테스트하는데 도움을 준다.
  • Mock 객체에 원하는 동작을 미리 정하고 이를 기반으로 테스트 함
  • when 메서드를 통해 원하는 동작을 미리 정하고 이를 기반으로 테스트한다. 
  • verify 메서드는 특정 메서드의 호출이 잘 이루어졌는지 확인할 수 있다.

BDDMockito

  • BDDMockito는 Mockito를 상속한 클래스로 Mockito와 동작이 차이 없다.
  • BDD는 시나리오를 기반으로 테스트하는 패턴으로 Given, When, Then 구조로 테스트를 설계한다.
    • 테스트 대상이 A상태에서 출발하며(Given) 어떤 상태 변화를 가했을 때(When), 기대하는 상태로 완료되어야 한다(Then).
  • Mockito에서 Given에 해당하는 상황에 when 메서드를 사용하다보니 가독성이 좋지 않아 시나리오에 맞게 테스트를 이해할 수 있도록 given 메서드를 포함하는 BDDMockito가 등장하게 되었다.
    • Mockito.when → BDDMockito.given
    • Mockito.verify → BDDMockito.then

3. @RestClientTest

 

Spring Boot에서 외부 API 테스트하기

안녕하세요? 이번 시간엔 Spring Boot의 @RestClientTest 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. 1. 문제 상황 예를 들어 외부 API를

jojoldu.tistory.com

  • 외부 API를 사용할 때 대상 API를 Mocking 할 수 있도록 지원한다.
  • 요청 받는 쪽을 위한 테스트가 아닌, 요청하는 쪽 입장에서의 테스트
  • @SpringBootTest와 달리 최소한의 Cotext만 사용해서 테스트를 진행
  • RestTemplate은 Mocking이 되지 않는다. 따라서 테스트 대상 Bean은 RestTemplateBuilder를 사용해야 한다.

API 연동에서 신경쓸 부분

 

외부 API 연동 테스트 코드 @RestClientTest

외부 API 연동 로직 개발하기 로직을 작성하다 보면 외부 API와의 연동은 피할 수 없게 되었습니다. 피할 수 없게 되었지만 테스트 코드를 짜기에는 아직도 까다로운 것도 사실입니다. 아직 Request

cobbybb.tistory.com

  • API Request 스펙에 맞는 URL로 request 되는가
  • API Request 스펙에 맞는 body가 구성되었는가
  • API Response 스펙에 맞는 연동 로직이 구성되었는가

 

 

4. 기본형 매개변수와 참조형 매개변수

 

[JAVA] 기본형 매개변수와 참조형 매개변수 [메서드 파라미터에 복사되는 값의 차이]

- 기본형 매개변수와 참조형 매개변수 자바에서 메서드를 호출할 때 매개변수로 지정한 값을 메서드의 매개변수에 복사하여 넘겨준다. → 매개변수 타입이 기본형일 때는 기본형 값이 복사, 참

yermi.tistory.com

자바에서 메서드를 호출할 때 매개변수로 설정한 값을 메서드의 매개변수에 복사하여 넘겨준다.

  • 매개변수 타입이 기본형일 때는 기본형 값이 복사, 참조형이면 인스턴스의 주소가 복사
  • 배열도 객체와 같이 주소갑을 가지고 있어 객체처럼 매개변수를 통해 값을 변경할 수 있다.