1.1 모키토 라이브러리

오늘 우리는 고급 테스트에 대해 알게 될 것입니다. 보다 구체적으로 Mockito 라이브러리를 사용합니다 . 이 사업에서 벗어날 생각조차 하지 마십시오.

첫째, 이 라이브러리는 Spring 테스트 의 표준입니다 . 실제로 Java 백엔드 개발 업계의 표준입니다.

둘째, Spring 코드에 대한 테스트를 작성해야 합니다 . 작성한 백엔드가 제대로 작동하는지 이해하는 유일한 방법은 해당 API의 메소드를 호출하는 것입니다 . 그리고 테스트를 통해 수행하는 것이 그렇지 않은 것보다 10배 더 쉽습니다. 직접 확인하실 수 있습니다.

pom.xml다음 코드를 사용하여 Mockito 라이브러리를 추가 할 수 있습니다.

<dependency>
    <groupId>org.mockito</groupId>
    <artifactId>mockito-junit-jupiter</artifactId>
    <version>4.2.0</version>
    <scope>test</scope>
</dependency>

Mockito 프로젝트의 전체 소스 코드는 GitHub 에서 찾을 수 있습니다 .

1.2 모의 객체

그렇다면 이 Mockito는 무엇이며 왜 그렇게 좋은가요?

테스트 개발 및 개발 과정에서 실제 개체 대신 일종의 "스텁"을 코드에 삽입해야 하는 경우가 매우 많았습니다.

예를 들어, 데이터베이스와 함께 작동하는 코드는 테스트되고 거기에서 무언가를 변경합니다. 각 테스트 전에 이 데이터베이스의 상태가 동일한 것이 좋습니다(그렇지 않으면 테스트가 달라집니다). 그리고 이러한 상태를 빠르게 롤백하기 위해 베이스가 더 간단했으면 합니다.

또는 예를 들어 유용한 SMS를 보내는 코드를 테스트하고 있습니다. 다이렉트 메일링의 경우 일종의 유료 SMS 게이트웨이를 사용합니다. 이해할 수없는 사람들에게 수백 개의 SMS를 보내지 않도록 코드를 테스트하기 위해 일부 가상 게이트웨이를 여기에 넣는 것이 좋을 것입니다.

또는 코드가 테스트 서버에서 사용할 수 없는 다른 웹 서버의 데이터를 요청하고 있습니다. 또는 50번 테스트해야 하는 온라인 결제용 코드를 작성하고 실제 금융 채널에서만 사용할 수 있습니다.

나는 당신이 이해한다고 생각합니다 ... 가상 객체 또는 스텁 객체라고도하는 가상 객체는 매우 유용한 것입니다.

그리고 여기에 어려움이 있습니다. Java에는 정적 타이핑이 있습니다. 즉, 유형의 개체 대신 ReadDatabase변수에 개체에 대한 참조를 할당 하려면 에서 VirtualDatabase클래스를 상속해야 합니다 .VirtualDatabaseRealDatabase

그런 다음 클래스에는 RealDatabase다른 실제 개체에 대한 참조를 저장하는 많은 개인 메서드와 변수가 있으며 이러한 방식으로 일반 스텁을 작성할 수 없습니다. 이론적으로는 좋지만 실제로는 막 다른 골목입니다.

그리고 여기 Java 5에 다시 등장한 구조 ( DynamicProxy자세한 내용을 읽을 수 있음 )가 있습니다. 이를 통해 컴파일러가 불만을 제기하지 않는 가상 개체를 만들 수 있습니다.

이러한 가상 개체를 모의 라고 합니다 (모의 레이아웃이라는 단어에서 유래). Mockito 라이브러리는 이러한 모의 객체로 작업을 전례 없는 수준으로 끌어올릴 수 있었습니다. 그건 그렇고, 도서관의 이름입니다.

1.3 @ExtendWith 주석

Mockito 라이브러리는 JUnit과 잘 작동하며 JUnit의 확장으로 간주될 수도 있습니다.

단위 테스트에서 Mockito 라이브러리를 활성화하는 방법에는 두 가지가 있습니다. 첫 번째 방법은 특수 주석을 추가하는 것입니다.

@ExtendWith(MockitoExtension.class)
public class MockitoAnnotationTest {
    ...
}

두 번째 방법은 메소드를 호출하여 작업을 활성화하는 것입니다 openMocks().

public class MockitoAnnotationTest {
    @BeforeEach
    public void init() {
        MockitoAnnotations.openMocks(this);
   }
}

대부분의 경우 첫 번째 옵션이 표시되지만 두 번째 옵션이 있다는 것을 아는 것이 유용할 때도 있습니다.