mockito tutorial mockito framework
Mockito 프레임 워크에 대한 완전한 가이드 : Mockito 실습 자습서
7z 파일이란 무엇입니까?
단위 테스트는 제공 될 코드에 대해 높은 수준의 신뢰를 얻을 수있는 간단하면서도 효과적인 기술입니다.
또한 체크인되는 모든 코드 조각에서 회귀 문제를 방지합니다.
마이크로 서비스 종류의 아키텍처 (및 기본 데이터베이스 호출을 포함하는 단순한 구조의 경우에도)를 사용하면 간단한 단위 테스트로 충분하지 않습니다. 우리에게 필요한 것은 종속성을 모의하고 테스트중인 메서드의 실제 논리를 테스트하는 것입니다.
이 시리즈의 모든 Mockito 튜토리얼 목록 :
튜토리얼 # 1 : 단위 테스트에서 모의하기위한 Mockito 프레임 워크 (이 튜토리얼)
튜토리얼 # 2 : Mockito에서 모의와 스파이 만들기
튜토리얼 # 3 : Mockito가 제공하는 다양한 유형의 매처
튜토리얼 # 4 : Mockito를 사용하여 비공개, 정적 및 무효 메서드 모의
튜토리얼 # 5 : Mockito 인터뷰 질문 상위 12 개
************************************************* * *******************
이 Mockito 시리즈의 튜토리얼 개요
튜토리얼 # | 배울 것 |
---|---|
튜토리얼 # 1 : | 단위 테스트에서 모의하기위한 Mockito 프레임 워크 Mockito로 조롱 배우기-코드 예제와 함께 초보자를위한 포괄적 인 Mockito 튜토리얼. 단위 테스트에서 모의를위한 모의 프레임 워크를 알아 봅니다. |
튜토리얼 # 2 : | Mockito에서 모의와 스파이 만들기 Mocks와 Spies는 테스트 복식의 유형으로 단위 테스트 작성에 도움이됩니다. 둘 다이 Mockito Spy 튜토리얼에서 코드 예제와 함께 설명됩니다. |
튜토리얼 # 3 : | Mockito가 제공하는 다양한 유형의 매처 Mockito에서 제공하는 다양한 유형의 매처를 사용하는 방법을 알아 봅니다. 매처는 특정 입력 / 출력 대신 입력 범위를 지정하는 와일드 카드와 같습니다. Argument와 Verification은 Mockito의 두 가지 유형의 Matcher이며 여기에서 자세히 설명합니다. |
튜토리얼 # 4 : | Mockito를 사용하여 비공개, 정적 및 무효 메서드 모의 예제와 함께 Mockito에서 Mocking Private, Static 및 Void 메서드를 알아보십시오. 단위 테스트 프레임 워크 PowerMockito로 개인 및 정적 메서드 모의를 알아보세요. |
튜토리얼 # 5 : | Mockito 인터뷰 질문 상위 12 개 Mockito 인터뷰 질문 및 답변 샘플 코드 예제. 이것은 Mockito Mocking Framework 인터뷰를 성공적으로 깨뜨리는 데 도움이 될 것입니다. |
이 시리즈의 첫 번째 튜토리얼부터 시작하겠습니다 !!
학습 내용 :
단위 테스트에서 조롱
Mocks / Stubs는 특히 단위 테스트를 만드는 동안 사람들이 일반적으로 듣는 용어입니다.
그래서 본질적으로 모킹이란 무엇입니까? 간단히 말해, 핵심 로직을 테스트하기 위해 테스트중인 코드가 의존하는 제어 된 인스턴스 또는 종속성 구현을 제공하는 것입니다.
제어 된 인스턴스로 언급 한 이유는 종속성의 동작을 테스트중인 메서드 또는 시스템에 대해 원하는대로 프로그래밍하거나 제어 할 수 있기 때문입니다.
다이어그램으로 설명하기 위해 비즈니스 또는 전자 상거래 애플리케이션의 예를 들어 보겠습니다. 이러한 거의 모든 유형의 애플리케이션에는 주로 3 개의 레이어가 있습니다. 사용자 인터페이스, 비즈니스 계층 및 데이터 액세스 계층 (기본 데이터 저장소와 통신)
위의 다이어그램을 참조하면 비즈니스 계층에는 3 개의 종속성, 즉 데이터 액세스 계층과 서비스 1 및 서비스 2 인 2 개의 다른 서비스가 있습니다.
이런 식으로보세요 – Google지도와 같은 앱은
- MySQL 또는지도 데이터를 저장하는 다른 SQL 데이터베이스와 같은 실제 데이터 저장소.
- 위치의 위도와 경도를 제공하는 CoordinateService와 같은 외부 서비스입니다.
- 특정 좌표 쌍에 대한 실시간 교통 정보를 제공하는 교통 서비스와 같은 외부 서비스입니다.
따라서 누군가가 단위 테스트를 사용하여 핵심 비즈니스 논리의 유효성을 검사하려는 경우 이러한 종속성을 구현하지 않는 한 테스트를 실행할 수 없습니다.
Mocks는 종속성이 실행되고 실행 중인지 여부에 관계없이 항상 테스트중인 코드에서 호출되는 종속성에 대해 프로그래밍 된 응답으로 비즈니스 논리를 실행할 수있는 이러한 상황에서 구제됩니다.
테스트 복식의 유형 / 카테고리
Mock은 본질적으로 'Test Double'의 한 유형이며 기술 전문 용어입니다. 'Test Double'은 본질적으로 동등한 실제 개체 인스턴스 또는 종속성으로 대체되는 개체를 의미합니다.
아래에 언급 된대로 여러 유형의 테스트 복식이 있습니다.
# 1) 가짜 :
가짜는 테스트중인 시스템에 로컬이라는 점을 제외하면 실제 종속성과 유사한 작동 구현입니다.
예: 실제 프로덕션 DB에 도달하는 대신 테스트는 간단한 수집 / 메모리를 사용하여 데이터를 저장합니다.
# 2) 스텁 :
스텁은 테스트중인 시스템에서 종속성이 호출 될 때 미리 구성된 응답입니다.
# 3) 스파이 :
이름에서 알 수 있듯이 실제로는 일부 감시 메커니즘이있는 실제 함수 (종속성) 호출입니다. 호출을 게시하면 매개 변수와 함께 호출이 실제로 트리거되었는지 여부를 확인할 수 있습니다.
# 4) 목 :
모의 객체는 Stubbed / 사전 구성된 응답을 지정할 수있는 특수한 개체 인스턴스입니다. 모의가 호출되었다는 사실은 테스트에서 어설 션으로 확인할 수 있습니다.
예를 들면 :
실행 중에 지정된 주소로 이메일을 보내는 보고서 생성기 기능이 있습니다.
실제 이메일을 보내고 싶지 않기 때문에 테스트 중에 EmailService가 모의 처리됩니다 (이메일을 보내는 이메일 메서드는 호출 될 때 아무 작업도하지 않도록 구성됨). 테스트가 끝나면 이메일 서비스의 이메일 전송 방법이 mocked 객체를 통해 호출되었는지 확인할 수 있습니다.
다양한 모의 프레임 워크
거의 모든 언어가 다양한 종류의 조롱 프레임 워크를 제공합니다. Java 용 오픈 소스 Mocking 프레임 워크 인 Mockito를 사용하여 샘플 코드를 작성합니다.
모의 종속성이있는 간단한 단위 테스트의 분석. 모든 과목에서 학생의 총점을 계산하여 DB에 쓰는 응용 프로그램을 단위 테스트하려고한다고 가정합니다.
public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for (int score: scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); }
이제 우리가 computeSumAndStore 메소드에 대한 단위 테스트를 작성하고 싶다면 합계를 저장하기위한 실제 데이터베이스 구현이 없을 수도 있습니다. 이 경우에는이 함수를 단위 테스트 할 수 없습니다.
그러나 mock을 사용하면 데이터베이스 서비스에 대한 Mock을 전달하고 나머지 논리의 유효성을 검사 할 수 있습니다.
아래와 같이 샘플 테스트 :
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores('student1', 220); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
위의 테스트에서 보았고, 부모 클래스 (테스트중인 메서드의 경우)에 mockDatabase 객체를 제공했으며 mockedDatabase 객체에 대한 스텁 응답을 설정했습니다 – 위의 Line # 6 (Mockito.doNothing (). when (mockDatabase) .updateScores ( 'student1', 220);)
위에서 주목해야 할 중요한 사항은 다음과 같습니다.
#1) 모의 객체는 함수 실행 중에 호출 될 모든 메서드에 대해 스텁 응답을 설정해야합니다.
#두) 스텁 작성 중에 지정된 매개 변수는 특정 적이거나 일반적 일 수 있습니다.
예 위의 경우 – updateScores 메소드에 대한 매개 변수를 'student1'및 220으로 지정했습니다. 이것이 메소드가 호출 될 정확한 입력이라는 것을 알고 있기 때문입니다.
# 3) 확인하는 동안 다음 사항을 확인합니다.
- mockDatabase.updateScores 메서드가 호출되었습니다.
- 인수는 각각“student1”과 220이었습니다.
- updateScores 메서드가 한 번 호출되었습니다.
이제이 테스트 코드를 약간 변경하고 어떤 일이 발생하는지 살펴 보겠습니다.
mock 설정의 인수를 'student1'에서 anyString으로 변경합니다 (Mockito는 anyString ()이라는 표준 매처를 제공함) & 220을 anyInteger로 변경합니다 (Mockito는 anyInt ()라는 표준 매처를 제공하며 모든 정수 값과 일치합니다)
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 220); }
테스트를 다시 실행하면 테스트가 여전히 녹색이어야합니다.
(이제 확인 / 어설 션을 변경하고 인수 중 하나를 변경해 보겠습니다.
220을 230으로 변경하겠습니다. 이제 이것이 databaseUpdate가 호출되어야하는 예상 인수가 아니므로 테스트가 실패 할 것으로 예상됩니다.
@Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = { 60, 70, 90 }; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); }
테스트를 실행 한 후 아래 표시된 오류 로그를 참조하십시오 (실제 인수가 예상되는 인수와 일치하지 않는다는 것을 분명히 언급 함).
인수가 다릅니다! 구함 :
mockDatabase.updateScores ( 'student1', 230);
-> com.mocking.sampleMocks.StudentScoreUpdatesUnitTests.calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb (StudentScoreUpdatesUnitTests.java:37)
실제 호출에는 다른 인수가 있습니다.
mockDatabase.updateScores ( 'student1', 220);
소스 코드
인터페이스 – IDatabase.java
public interface IDatabase { public void updateScores(String studentId, int total); }
테스트중인 클래스 – StudentScoreUpdates.java
public class StudentScoreUpdates { public IDatabase databaseImpl; public StudentScoreUpdates(IDatabase databaseImpl) { this.databaseImpl = databaseImpl; } public void calculateSumAndStore(String studentId, int() scores) { int total = 0; for(int score : scores) { total = total + score; } // write total to DB databaseImpl.updateScores(studentId, total); } }
단위 테스트 클래스 – StudentScoreUpdatesUnitTests.java
public class StudentScoreUpdatesUnitTests { @Mock public IDatabase mockDatabase; public StudentScoreUpdates studentScores; @BeforeEach public void beforeEach() { MockitoAnnotations.initMocks(this); } @Test public void calculateSumAndStore_withValidInput_shouldCalculateAndUpdateResultInDb() { // Arrange studentScores = new StudentScoreUpdates(mockDatabase); int() scores = {60,70,90}; Mockito.doNothing().when(mockDatabase).updateScores(anyString(), anyInt()); // Act studentScores.calculateSumAndStore('student1', scores); // Assert Mockito.verify(mockDatabase, Mockito.times(1)).updateScores('student1', 230); } }
결론
지금까지 살펴본 것은 Java의 Mockito 프레임 워크를 사용한 Mock 설정의 매우 기본적이고 간단한 예입니다.
모의와 관련된 단위 테스트의 거의 60-70 %에 대해 테스트는 유사한 구조를 가져야합니다. Mockito는 광범위한 모의 요구 사항에 대한 많은 고급 구성 / 지원을 제공하고 종속성 주입을 사용하여 모의 인스턴스를 주입하고 실제 메서드 호출을 실제로 감시하고 호출을 확인하는 스파이를 제공합니다.
다가오는 튜토리얼에서는 Mockito의 Mocks 및 Spies 개념에 대해 자세히 설명합니다.