> 백엔드 개발 > Golang > Go에서 함수를 효과적으로 모의하려면 어떻게 해야 합니까?

Go에서 함수를 효과적으로 모의하려면 어떻게 해야 합니까?

Linda Hamilton
풀어 주다: 2024-12-06 21:23:14
원래의
450명이 탐색했습니다.

How Can I Effectively Mock Functions in Go?

Golang에서 모의 ​​함수

소개

Go에서는 func F()와 같은 구체적인 유형에 선언된 함수를 모의합니다. {} func (T) M() {}은 불가능합니다. 그러나 유사한 기능을 달성하기 위한 다른 접근 방식이 있습니다.

함수 값 모의

Go에서는 함수 값이 변수에 저장되어 있는지, 구조체의 필드로 저장되어 있는지, 아니면 함수 값을 모의하는 것이 허용됩니다. 다른 함수에 전달되는 매개변수. 예를 들어 다음을 고려하세요.

var Fn = func() { ... }

type S struct {
    Fn func()
}

func F(Fn func())
로그인 후 복사

세 가지 경우 모두 Fn은 모의 가능합니다.

모의 인터페이스

Go에서 모의하는 데 더 선호되는 접근 방식은 다음을 사용하는 것입니다. 인터페이스. 예:

type ProductRepository interface {
    GetProductById(DB *sql.DB, ID int) (p Product, err error)
}

// The real implementer
type ProductStore struct{}

func (ProductStore) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    q := "SELECT * FROM product WHERE id = ?"
    // ...
}

// The mock implementer
type ProductRepositoryMock struct{}

func (ProductRepositoryMock) GetProductById(DB *sql.DB, ID int) (p Product, err error) {
    // ...
}
로그인 후 복사

이제 ProductRepository를 사용하는 모든 코드는 일반 시나리오에서는 ProductStore를 사용할 수 있고 테스트 중에는 ProductRepositoryMock을 사용할 수 있습니다.

*sql.DB에 대한 모의 인터페이스

또 다른 기존 함수 선언을 보존할 수 있는 모의 옵션은 다음의 메서드를 모방하는 인터페이스를 정의하는 것입니다. *sql.DB를 사용하고 대신 사용하세요. 예를 들면 다음과 같습니다.

type DBIface interface {
    Query(query string, args ...interface{}) (*sql.Rows, error)
    // Only declare methods that are actually used.
}

type DBMock struct{}

func (DBMock) Query(query string, args ...interface{}) (*sql.Rows, error) {
    // ...
}

func GetProductByName(DB DBIface, name string) (p Product, err error) {
    ...
}
로그인 후 복사

이 접근 방식을 사용하면 GetProductByName에 대한 DB 매개 변수가 모의 가능해집니다.

위 내용은 Go에서 함수를 효과적으로 모의하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿