본문 바로가기

Spring boot

Spring Boot 끄적끄적(4)

반응형

 

AssertJ란?

테스트에 관련된 많은 기능을 제공하고 메서드 체이닝으로 가독성 높은 테스트 코드 작성을 지원하는 오픈 라이브러리입니다.
 assertThat(검증대상)로 시작하며 메서드 체이닝을 이용하여 검증 메서드를 연쇄적으로 더 깔끔하고 가독성 있게 테스트 코드를 작성할 수 있습니다.

asserThat이 가독성이 조금 더 좋다고 합니다.

 

 

Optional 올바르게 사용하기

1. Optional 변수에 절대로 null 을 할당 하지 말 것

나쁜 예 :

 
Optional<Member> findById(Long id) {
 
    // find Member from db
 
    if (result == 0) {
 
        return null;
 
    }
 
}

 

 

좋은 예 :

 
Optional<Member> findById(Long id) {
 
    // find Member from db
 
    if (result == 0) {
 
        return Optional.empty();
 
    }
 
}

반환 값으로 null 을 사용하는 것이 위험하기 때문에 등장한 것이 Optional 이다.
당연히 Optional 대신 null 을 반환하는 것은 Optional 의 도입 의도와 맞지 않는다.

Optional 은 내부 값을 null 로 초기화한 싱글톤 객체를 Optional.empty() 메소드를 통해 제공하고 있다.

https://dev-coco.tistory.com/178 

 

[Java] Optional 올바르게 사용하기

개요 Java 언어 설계자인 Brian Goetz는 Optional 을 만든 의도를 다음과 같이 공식 API 문서에 작성해 두었다. API Note: Optional is primarily intended for use as a method return type where there is a clear need to represent "no re

dev-coco.tistory.com

 

 

Mockito

  • 모키토는, 개발자가 동작을 직접적으로 제어할 수 있는 가짜 객체를 지원하는 테스트 프레임워크이다.
  • Spring 어플리케이션은 여러 객체들 간의 의존성이 생기는데 이러한 의존성을 모키토를 이용하여 단절 시킴으로 단위 테스트를 쉽게 작성하는 것을 도와준다.
@SpringBootTest
public class EventServiceTest {

    @Mock
    private EventRepository eventRepository;
    /*@Mock 어노테이션을 사용하여 EventRepository를 모킹합니다. 
    이로써 실제 EventRepository가 아닌 가짜 객체를 사용하게 됩니다.*/

    @InjectMocks
    private EventService eventService;
    /*@InjectMocks 어노테이션을 사용하여 EventService를 생성하고, 
    이 서비스에 모킹된 EventRepository를 주입합니다.*/

    private Event event;

    @BeforeEach
    void setUp() {
        MockitoAnnotations.openMocks(this);
        //MockitoAnnotations.openMocks(this)를 호출하여 Mockito 어노테이션을 활성화합니다.
        
        event = new Event();
        event.setId(1L);
        event.setStartTime(LocalDateTime.now());
        event.setEndTime(LocalDateTime.now().plusHours(1));
        event.setNumberOfWinners(0);
    }
    
    @Test
    void testSetStartTime() {
        // given
        LocalDateTime newStartTime = LocalDateTime.now().plusHours(2);
        when(eventRepository.findById(anyLong())).thenReturn(Optional.of(event));

        // when
        eventService.setStartTime(1L, newStartTime);

        // then
        verify(eventRepository, times(1)).findById(anyLong());
        verify(eventRepository, times(1)).save(any(Event.class));
        assertThat(event.getStartTime()).isEqualTo(newStartTime);
    }
    
    
 }

이런 식으로 사용하면 된다.

 

 

POJO(Plain Old Java Object)

스프링은 POJO 프로그래밍을 지향하는 프레임워크이다

최대한 다른 환경이나 기술에 종속적이지 않도록 하기 위한 POJO 프로그래밍 코드를 작성하기 위해 Spring 프레임워크에서는  IoC/DI, AOP, PSA를 지원하고 있다.

 

엔티티 클래스는 기본 생성자가 필요하다!!

JPA와 같은 ORM 프레임워크는 엔터티 클래스의 인스턴스를 생성할 때 기본 생성자를 필요로 합니다.

기본 생성자는 매개 변수가 없는 생성자입니다. 만약 명시적으로 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 추가하지만, 명시적으로 매개 변수가 있는 생성자를 정의하면 기본 생성자는 자동으로 추가되지 않습니다. 따라서 기본 생성자를 명시적으로 추가해야 합니다.

 

반응형

'Spring boot' 카테고리의 다른 글

RESTful API 란 무엇인가??  (0) 2024.07.25
SpringBoot TDD 끄적끄적  (0) 2024.07.21
Spring boot 끄적끄적(3)  (0) 2024.07.16
NoSQL vs SQL  (0) 2024.07.16
Spring boot 끄적 끄적(2)  (1) 2024.07.09