Go의 원숭이 패치
Go 프로그래밍 언어에서 인터페이스를 중심으로 구조화되지 않은 코드를 처리할 때 모킹이 어려울 수 있습니다. 구조체가 직접 상호 연결되어 있고 종속성 주입이 없으면 기본 코드를 수정하지 않고 효과적으로 테스트하고 벤치마킹하는 능력이 방해를 받습니다.
Python과 같은 스크립팅 언어에서 떠올릴 수 있는 기술 중 하나는 원숭이 패치입니다. 객체는 런타임에 수정될 수 있습니다. Go에는 객체를 직접 수정하기 위한 동등한 메커니즘이 없지만 유사한 결과를 얻기 위한 대체 접근 방식이 있습니다.
일반적인 전략 중 하나는 모의하려는 구조체 주위의 래퍼로 고유한 인터페이스를 만드는 것입니다. 이를 통해 기본 구조체의 원래 기능을 유지하면서 인터페이스 메서드에서 원하는 동작을 구현할 수 있습니다. 예를 들면 다음과 같습니다.
type MyInterface interface { DoSomething(i int) error DoSomethingElse() ([]int, error) } type Concrete struct { client *somepackage.Client } func (c *Concrete) DoSomething(i int) error { return c.client.DoSomething(i) } func (c *Concrete) DoSomethingElse() ([]int, error) { return c.client.DoSomethingElse() }
MyInterface를 구현하면 이제 테스트를 위한 모의 구현을 생성할 수 있습니다.
// MockMyInterface implements MyInterface for testing purposes type MockMyInterface struct { mockedDoSomethingError error mockedDoSomethingElseResult []int } func (m *MockMyInterface) DoSomething(i int) error { return m.mockedDoSomethingError } func (m *MockMyInterface) DoSomethingElse() ([]int, error) { return m.mockedDoSomethingElseResult, nil }
댓글에서 @elithrar가 제안한 또 다른 접근 방식은 자신의 구조체 내에서 모의하려는 유형입니다. 이를 통해 필요한 메서드만 선택적으로 모의할 수 있습니다.
type Concrete struct { *somepackage.Client }
클라이언트를 내장하면 DoSomethingNotNeedingMocking과 같은 메서드를 인터페이스에 추가하거나 모의 개체를 만들지 않고도 직접 호출할 수 있습니다.
이러한 기술은 인터페이스를 중심으로 구성되지 않은 코드 테스트 및 벤치마킹을 위한 Monkey 패치에 대한 실행 가능한 대안을 제공합니다.
위 내용은 테스트 및 벤치마킹을 위해 Go에서 원숭이 패치 효과를 어떻게 얻을 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!