Mockery에 대하여

Mockery란?

Go 언어에서 인터페이스를 모킹하기 위한 도구로, 테스트 중에 인터페이스의 구현을 쉽게 대체할 수 있어서 테스트를 더 단순하고 효율적으로 만들 수 있다.
개발자가 수동으로 모킹 코드를 작성할 필요 없이 만들어져있는 인터페이스 기반으로 명령어로 모킹 클래스를 생성할 수 있어서 생산성이 높아진다. 모킹을 통해 외부 시스템이나 데이터베이스, 네트워크 호출과 같은 의존성을 제하고 테스트를 실행할 수 있다.

이러한 부분이 다음과 같은 특징을 갖는다.

  • 테스트의 격리성과 실행 속도 개선
  • 테스트의 예측 가능성 향상
  • 인터페이스만 사용 가능
  • 실제 구현의 정확성 보장 X

사용

$ go get github.com/vektra/mockery/v2
  • 예제

인터페이스 정의

package mypackage

type MyInterface interface {
    MyMethod(param1 string, param2 int) error
}

Mock 생성

$ mockery --name=MyInterface

테스트 작성

package mypackage_test

import (
    "mypackage"
    "mypackage/mocks"
    "testing"

    "github.com/stretchr/testify/assert"
)

func TestSomething(t *testing.T) {
    mock := &mocks.MyInterface{}
    mock.On("MyMethod", "arg1", 123).Return(nil)

    // 테스트 로직...
    err := someFunctionThatUsesMyInterface(mock)
    assert.NoError(t, err)

    mock.AssertExpectations(t)
}

설정

추천하는 기본 설정은 다음과 같다.

with-expecter: true
packages:
    github.com/your-org/your-go-project:
        # place your package-specific config here
        config:
        interfaces:
            # select the interfaces you want mocked
            Foo:
                # Modify package-level config for this specific interface (if applicable)
                config:

매개변수 설명

nametemplateddefaultdescription
allXfalse지정된 패키지의 모든 인터페이스에 대해 모킹 생성합니다.
boilerplate-fileX""모든 생성된 모킹 파일 상단에 표시하고 싶은 주석이 포함된 파일의 경로를 지정합니다. 이는 일반적으로 소스 코드 상단에 라이선스 헤더를 표시하는 데 사용됩니다.
configX""mockery 구성 파일의 위치를 설정합니다.
dirO“mocks/{{.PackagePath}}”모킹 파일이 출력될 디렉토리입니다.
disable-config-searchXfalse구성 파일 검색을 비활성화합니다.
disable-version-stringXfalse생성된 모킹 파일에서 버전 문자열을 비활성화합니다.
dry-runXfalse수행될 작업을 출력하지만 실제로 작업을 수행하지 않습니다.
excludeX[]recursive: True를 사용할 때 제외할 하위 패키지를 지정합니다.
exclude-regexX""include-regex와 함께 설정되면, include-regex와 일치하지만 exclude-regex와도 일치하는 인터페이스는 생성되지 않습니다. all이 설정되어 있거나 include-regex가 설정되지 않은 경우, exclude-regex는 효과가 없습니다.
filenameO“mock_{{.InterfaceName}}.go”모킹가 위치할 파일의 이름입니다.
include-auto-generatedXtrue재귀적 패키지 탐색 중에 자동 생성된 파일을 건너뛰려면 false로 설정합니다. true로 설정하면, mockery는 특정 디렉토리가 가져올 수 있는 패키지인지 결정할 때 자동 생성된 파일을 포함합니다.
include-regexX""설정되면, 표현식과 일치하는 인터페이스 이름만 생성됩니다. 이 설정은 구성에서 all: True가 지정된 경우 무시됩니다. 생성되는 인터페이스를 더욱 세밀하게 조정하려면 exclude-regex를 사용하세요.
inpackageXfalse원본 인터페이스와 같은 패키지에 모킹를 생성할 때, inpackage: True를 지정하여 모킹가 원본 인터페이스와 같은 패키지에 배치됨을 mockery에 알려야 합니다.
mocknameO“Mock{{.InterfaceName}}”생성될 모킹의 이름입니다.
outpkgO“{{.PackageName}}”생성된 모킹의 패키지 이름을 지정하려면 outpkg를 사용하세요.
log-levelX“info”로거의 수준을 설정합니다.
packagesXnull모킹를 생성할 패키지와 인터페이스에 대한 구성을 설명하는 사전입니다.
printXfalse결과 코드를 디스크에 쓰는 대신 출력하려면 print: True를 사용하세요.
recursiveXfalse특정 패키지에 대해 true로 설정하면, mockery는 모든 하위 패키지를 재귀적으로 검색하고 해당 패키지를 구성 맵에 주입합니다.
tagsX""생성된 모킹의 빌드 태그를 설정합니다.
with-expecterXtrue모킹에 EXPECT() 메소드를 생성하려면 with-expecter: True를 사용하세요. 이는 모킹 설정을 위한 선호되는 방법입니다.
replace-typeXnull생성 중에 별칭, 패키지 및/또는 유형을 교체합니다.

템플릿 함수

Go 패키지 text/template를 기반으로 설정파일 내 package에서 사용할 수 있다.

FunctionArgument(s)Description
containsstring, substr문자열 내에 부분 문자열이 포함되어 있는지 확인합니다.
hasPrefixstring, prefix문자열이 특정 접두사로 시작하는지 확인합니다.
hasSuffixstring, suffix문자열이 특정 접미사로 끝나는지 확인합니다.
joinelems, sep지정된 구분자로 요소들을 결합합니다.
replacestring, old, new, n문자열 내의 ‘old’를 ’new’로 n번 교체합니다.
replaceAllstring, old, new문자열 내의 ‘old’를 ’new’로 모두 교체합니다.
splitstring, sep문자열을 구분자에 따라 분할합니다.
splitAfterstring, sep구분자 이후로 문자열을 분할합니다.
splitAfterNstring, sep, n구분자 이후로 문자열을 n개로 분할합니다.
trimstring, cutset문자열 양쪽에서 지정된 문자 집합을 제거합니다.
trimLeftstring, cutset문자열 왼쪽에서 지정된 문자 집합을 제거합니다.
trimPrefixstring, prefix문자열에서 지정된 접두사를 제거합니다.
trimRightstring, cutset문자열 오른쪽에서 지정된 문자 집합을 제거합니다.
trimSpacestring문자열 양쪽에서 공백을 제거합니다.
trimSuffixstring, suffix문자열에서 지정된 접미사를 제거합니다.
lowerstring문자열을 소문자로 변환합니다.
upperstring문자열을 대문자로 변환합니다.
camelcasestring문자열을 카멜케이스로 변환합니다.
snakecasestring문자열을 스네이크케이스로 변환합니다.
kebabcasestring문자열을 케밥케이스로 변환합니다.
firstLowerstring문자열의 첫 글자를 소문자로 변환합니다.
firstUpperstring문자열의 첫 글자를 대문자로 변환합니다.
matchStringpattern주어진 패턴과 문자열이 일치하는지 확인합니다.
quoteMetastring문자열에서 정규 표현식 메타문자를 이스케이프합니다.
basestring파일 경로에서 마지막 요소를 반환합니다.
cleanstring파일 경로를 정리합니다.
dirstring파일 경로에서 디렉토리 부분을 반환합니다.
expandEnvstring문자열 내의 환경 변수를 확장합니다.
getenvstring환경 변수의 값을 반환합니다.

템플릿 변수

VariableDescription
InterfaceDir모킹 대상이 되는 원본 인터페이스의 디렉토리 경로입니다. dir: "{{.InterfaceDir}}"을 사용하여 원본 인터페이스와 인접한 위치에 모킹를 배치할 수 있습니다. 외부 인터페이스에는 사용하지 않는 것이 좋습니다.
InterfaceDirRelative현재 작업 디렉토리에 상대적인 원본 인터페이스의 디렉토리 경로입니다. 현재 작업 디렉토리에 상대적으로 경로를 설정할 수 없는 경우, 이 변수는 PackagePath와 동일하게 설정됩니다.
InterfaceName모킹 대상이 되는 원본 인터페이스의 이름입니다.
Mock인터페이스가 내보내진 경우 ‘Mock’, 내보내지 않은 경우 ‘mock’인 문자열입니다. 모킹 이름을 다음과 같이 설정할 때 유용합니다: mockname: "{{.Mock}}{{.InterfaceName}}". 이렇게 하면 모킹 이름이 원본 인터페이스의 내보내기 여부를 유지합니다.
MockName생성될 모킹의 이름입니다. 이는 단순히 mockname 구성 변수입니다.
PackageName원본 인터페이스의 패키지 이름입니다.
PackagePath원본 인터페이스의 완전한 패키지 경로입니다.

댓글