2023 년 6 월 업데이트 : 이 저장소와 도구는 더 이상 유지 관리되지 않습니다. 대신 유지 된 포크는 Go.uber.org/mock을 참조하십시오.
Gomock은 Go 프로그래밍 언어를위한 조롱 프레임 워크입니다. GO의 내장 testing
패키지와 잘 통합되지만 다른 상황에서도 사용할 수 있습니다.
GO가 설치되면 mockgen
도구를 설치하십시오.
참고 : 당신이 그렇게하지 않았다면, 이미 당신의 PATH
에 $GOPATH/bin
추가하십시오.
최신 릴리스 버전 사용을 얻으려면 :
GO111MODULE=on go get github.com/golang/mock/[email protected]
go install github.com/golang/mock/[email protected]
CI 파이프 라인에서 mockgen
사용하는 경우 특정 Mockgen 버전을 고정하는 것이 더 적절할 수 있습니다. 라이브러리는 모의를 생성하는 데 사용되는 Mockgen 버전과 동기화해야합니다.
mockgen
에는 소스와 반사의 두 가지 작동 모드가 있습니다.
소스 모드는 소스 파일에서 모의 인터페이스를 생성합니다. -source 플래그를 사용하여 활성화됩니다. 이 모드에서 유용 할 수있는 다른 플래그는 -morts 및 -aux_files입니다.
예:
mockgen -source=foo.go [other options]
반사 모드는 반사를 사용하여 인터페이스를 이해하는 프로그램을 구축하여 모의 인터페이스를 생성합니다. Import Path와 쉼표로 구분 된 기호 목록의 두 가지 비 플래그 인수를 전달하여 활성화됩니다.
""를 사용할 수 있습니다. " 현재 경로 패키지를 참조합니다.
예:
mockgen database/sql/driver Conn,Driver
# Convenient for `go:generate`.
mockgen . Conn,Driver
mockgen
명령은 조롱 할 인터페이스가 포함 된 Go 소스 파일이 주어진 Mock 클래스의 소스 코드를 생성하는 데 사용됩니다. 다음 깃발을 지원합니다.
-source
: 조롱 할 인터페이스가 포함 된 파일.
-destination
: 결과 소스 코드를 작성할 파일. 설정하지 않으면 코드가 표준 출력으로 인쇄됩니다.
-package
: 결과 모의 클래스 소스 코드에 사용할 패키지. 이 설정을 설정하지 않으면 패키지 이름이 mock_
입니다. 입력 파일의 패키지와 연결됩니다.
-imports
: 결과 소스 코드에 사용되어야하는 명시 적 수입 목록은 foo=bar/baz
양식의 쉼표로 구분 된 요소 목록으로 지정되어 있습니다. 여기서 bar/baz
는 가져 오는 패키지이고 foo
는 식별자입니다. 생성 된 소스 코드에서 패키지에 사용합니다.
-aux_files
: 다른 파일에 정의 된 EG 임베디드 인터페이스를 해결하기 위해 참조 해야하는 추가 파일 목록. 이것은 foo=bar/baz.go
bar/baz.go
소스 파일이고 foo
는 -source 파일에서 사용하는 해당 파일의 패키지 이름입니다.
-build_flags
: (반사 모드 만 해당) 플래그는 구두로 전달되어 go build
.
-mock_names
: 생성 된 모의에 대한 사용자 정의 이름 목록. 이것은 형식 Repository=MockSensorRepository,Endpoint=MockSensorEndpoint
쉼표로 구분 된 요소 목록으로 지정됩니다. 여기서 Repository
는 인터페이스 이름이고 MockSensorRepository
는 원하는 모의 이름입니다 (Mock Factory Method 및 Mock Recorder는 Mock의 이름을 따서 지어집니다). 인터페이스 중 하나에 사용자 정의 이름이 지정되지 않은 경우 기본 이름 지정 규칙이 사용됩니다.
-self_package
: 생성 된 코드의 전체 패키지 가져 오기 경로. 이 플래그의 목적은 자체 패키지를 포함시켜 생성 된 코드의 가져 오기 사이클을 방지하는 것입니다. 모의 패키지가 입력 중 하나 (일반적으로 기본)로 설정되고 출력은 stdio이므로 Mockgen이 최종 출력 패키지를 감지 할 수없는 경우 발생할 수 있습니다. 이 플래그를 설정하면 가져 오기 위해 가져 오는 Mockgen을 알려줍니다.
-copyright_file
: 결과 소스 코드에 저작권 헤더를 추가하는 데 사용되는 저작권 파일.
-debug_parser
: 파서 결과 만 인쇄합니다.
-exec_only
: (반사 모드) 설정된 경우이 반사 프로그램을 실행하십시오.
-prog_only
: (반사 모드) 반사 프로그램 만 생성합니다. 그것을 stdout에 쓰고 나가십시오.
-write_package_comment
: true 인 경우 패키지 문서 주석 (Godoc)을 작성합니다. (기본값)
mockgen
사용의 예는 sample/
디렉토리를 참조하십시오. 간단한 경우 -source
플래그 만 필요합니다.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
// Assert that Bar() is invoked.
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Asserts that the first and only call to Bar() is passed 99.
// Anything else will fail.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
Return ( 101 )
SUT ( m )
}
1.14+의 Go 버전, 1.5.0+의 Mockgen 버전을 사용하고 *testing.t를 gomock.NewController(t)
로 전달하는 경우 더 이상 ctrl.Finish()
명시 적으로 호출 할 필요가 없습니다. 자체 등록 된 정리 기능에서 자동으로 귀하를 요구합니다.
type Foo interface {
Bar ( x int ) int
}
func SUT ( f Foo ) {
// ...
}
func TestFoo ( t * testing. T ) {
ctrl := gomock . NewController ( t )
defer ctrl . Finish ()
m := NewMockFoo ( ctrl )
// Does not make any assertions. Executes the anonymous functions and returns
// its result when Bar is invoked with 99.
m .
EXPECT ().
Bar ( gomock . Eq ( 99 )).
DoAndReturn ( func ( _ int ) int {
time . Sleep ( 1 * time . Second )
return 101
}).
AnyTimes ()
// Does not make any assertions. Returns 103 when Bar is invoked with 101.
m .
EXPECT ().
Bar ( gomock . Eq ( 101 )).
Return ( 103 ).
AnyTimes ()
SUT ( m )
}
경기자가 실패를보고하면 수신 ( Got
) 대 예상 ( Want
) 값을 인쇄합니다.
Got: [3]
Want: is equal to 2
Expected call at user_test.go:33 doesn ' t match the argument at index 1.
Got: [0 1 1 2 3]
Want: is equal to 1
Want
수정 Want
값은 Matcher의 String()
메소드에서 나옵니다. 대응기의 기본 출력이 귀하의 요구를 충족하지 않으면 다음과 같이 수정할 수 있습니다.
gomock . WantFormatter (
gomock . StringerFunc ( func () string { return "is equal to fifteen" }),
gomock . Eq ( 15 ),
)
이것은 gomock.Eq(15)
Matcher의 출력 is equal to fifteen
수정 is equal to 15
Want:
Got
수정했습니다 Got
값은 사용 가능한 경우 개체의 String()
메소드에서 나옵니다. 경우에 따라 물체의 출력을 읽기가 어렵고 (예 : []byte
) 테스트가 다르게 인쇄하는 것이 도움이됩니다. 다음은 Got
값이 형식화되는 방법을 수정합니다.
gomock . GotFormatterAdapter (
gomock . GotFormatterFunc ( func ( i interface {}) string {
// Leading 0s
return fmt . Sprintf ( "%02d" , i )
}),
gomock . Eq ( 15 ),
)
수신 된 값이 3
인 경우 03
으로 인쇄됩니다.
cannot find package "."
... github.com/golang/mock/mockgen/model
반사 모드를 사용하고 벤더링 종속성을 사용하는 동안이 오류가 발생하면 선택할 수있는 세 가지 해결 방법이 있습니다.
import _ "github.com/golang/mock/mockgen/model"
.--build_flags=--mod=mod
추가하십시오. 이 오류는 최신 버전에서 go
명령의 기본 동작 변경 때문입니다. 자세한 내용은 #494에서 확인할 수 있습니다.