자바 테스트 스택에서 스위스 암호체 칼을 만들기

코드 시험 가능성은 효율적인 코드 설계에서 몇 가지 우수한 특징을 보장합니다. 유지 보수성을 개선하고, 문서화를 도와주며, 리팩토링과 진화하는 디자인/아키텍처를 구축하는 데 도움이 됩니다. 이에 대한 의심은 없지만, 프로젝트를 시작하기 위한 좋은 테스트 스택은 무엇일까요? 이 동영상에서는 Java로 프로젝트를 시작하기 위한 최소 테스트 스택을 설명합니다.

테스트 스택에 대해 최소한의 것에 대해 이야기할 때 첫 번째로 이해해야 할 점은 테스트 스택에 은탄환이 없다는 것입니다. 결국, 우리는 의존성을 포함하거나 제거해야 하는데, 특히 레거시 코드에 대해 이야기할 때 그렇습니다. 이에 대비하여, 저는 자바에서 처음부터 시작하기 위한 최소한으로 사용하고 추천하는 제 마음에 드는 테스트 스택을 제시하겠습니다.

  • JUnit-Jupiter: JUnit의 다섯 번째 버전은 이전 버전과의 호환성을 끊었지만, 많은 기능을 가지고 있어 특히 사용자 정의 확장을 만들 때 그 가치가 입증됩니다.

  • Mockito: 자바를 위한 매우 인기 있는 목 프레임워크입니다. 이러한 인기와 거대한 커뮤니티는 JUnit-Jupiter와 같은 여러 확장을 가능하게 합니다.

  • AssertJ: 저처럼 매끄러운 API를 좋아한다면 AssertJ는 당신을 위한 놀라운 라이브러리입니다.

Maven 프로젝트를 사용하여 이러한 라이브러리의 종속성을 추가할 수 있습니다.

XML

 

<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-engine</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter-params</artifactId>
    <version>${junit.version}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-core</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>${mockito.verson}</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.assertj</groupId>
    <artifactId>assertj-core</artifactId>
    <version>${assertj.verson}</version>
    <scope>test</scope>
</dependency>

축구 챔피언십 리그 컨텍스트를 가정할 때, 팀은 11명의 선수를 가져야 하며, 각 이름은 챔피언십 리그에서 고유해야 합니다. 이에 대한 테스트를 탐색할 수 있습니다.

JMockito와 테스트부터 시작하여, 데이터베이스에서 이름이 존재하는지 확인하는 서비스를 테스트해야 합니다. 이 시점에서 우리는 이것이 필요하지 않으며 통합 테스트를 만들고 싶지 않습니다.

우리는 비즈니스에 초점을 맞추고 싶으므로 데이터베이스나 프레임워크를 테스트하지 않고 코드만 테스트하고 싶습니다. 따라서 두 가지 시나리오, 이름이 있을 때와 없을 때 리포지토리를 목업할 것입니다.

Mockito와 JUnit-Jupiter의 통합을 사용하면 주석만으로 목을 주입할 수 있습니다. 아래 코드는 JMockito를 사용한 테스트를 보여줍니다. 이 테스트에서는 데이터베이스가 필요하지 않으며 비즈니스 테스트에 집중하지 않아도 됩니다.

Java

 

@ExtendWith(MockitoExtension.class)
class ChampionshipServiceTest {

    @Mock
    private ChampionRepository repository;

    @InjectMocks
    private ChampionshipService service;

    @Test
    public void shouldRegister() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(false);
        Team bahia = Team.of("Bahia");
        service.register(bahia);

        Mockito.verify(repository).existByName("Bahia");
    }
    @Test
    @DisplayName("should return an exception when there is a team with a name")
    public void shouldThrownAnExceptionWhenTeamNameExists() {
        Mockito.when(repository.existByName("Bahia")).thenReturn(true);
        Team bahia = Team.of("Bahia");
        Assertions.assertThrows(IllegalArgumentException.class, () ->
                service.register(bahia));

        Mockito.verify(repository).existByName("Bahia");
    }
}

AssertJ는 라이브러리가 지원하는 플루언트 API 덕분에 단언문을 더 이해하기 쉽게 만듭니다. 컬렉션, 맵 또는 단일 인스턴스를 테스트할 수 있습니다. 예를 들어, 팀에 선수를 추가하는 것을 확인하기 위해 사용할 수 있습니다.

Java

 

@Test
public void shouldCreatePlayers() {
    Team bahia = Team.of("Bahia");
    bahia.add(Player.of("Neymar", "Santos", 10));
    bahia.add(Player.of("Cristiano Ronaldo", "Lisbon", 10));

    org.assertj.core.api.Assertions.assertThat(bahia.players())
            .hasSize(2)
            .map(Player::name)
            .contains("Neymar", "Cristiano Ronaldo");
}

이 동영상에 대한 더 많은 정보를 확인하세요.

핵심 내용:

  • A minimum test stack to start Java

  • JUnit에 대해 자세히 알아보고 왜 좋은 선택인지 확인하세요

  • JMockito로 모의 객체에 대해 탐색하며 배워보세요

  • 플루언트 API AssertJ로 테스트를 아름답게 만드세요

Source:
https://dzone.com/articles/creating-your-swiss-army-knife-on-java-test-stack