>백엔드 개발 >Golang >더 쉬운 테스트를 위해 Go에서 원숭이 패치와 같은 동작을 달성하려면 어떻게 해야 합니까?

더 쉬운 테스트를 위해 Go에서 원숭이 패치와 같은 동작을 달성하려면 어떻게 해야 합니까?

DDD
DDD원래의
2024-12-08 17:19:10637검색

How Can I Achieve Monkey Patching-like Behavior in Go for Easier Testing?

Go의 Monkey Patching: 런타임에 객체를 수정하는 방법

Go에서는 인터페이스가 부족하고 밀접하게 상호 연결된 코드 기반으로 작업할 때 또는 구성 요소를 모의하거나 교체할 수 없기 때문에 종속성 주입, 테스트 또는 벤치마킹이 어려울 수 있습니다. 그러나 Python과 같은 스크립팅 언어에는 원숭이 패치와 유사한 기술이 있어 Go에서 런타임에 객체를 수정할 수 있습니다.

한 가지 접근 방식은 원본 객체를 래핑하고 테스트에서 모의 ​​작업을 허용하는 사용자 정의 인터페이스를 만드는 것입니다. . 예를 들어 somepackage라는 패키지에 의존하는 Concrete라는 구조체가 있는 경우:

type Concrete struct {
    client *somepackage.Client
}

원하는 메서드를 사용하여 고유한 인터페이스 MyInterface를 정의할 수 있습니다.

type MyInterface interface {
    DoSomething(i int) error
    DoSomethingElse() ([]int, error)
}

그런 다음, 모의 개체에 이 인터페이스를 구현합니다.

type MockConcrete struct {
    DoSomethingCalled bool
    DoSomethingElseCalled bool
}

func (m *MockConcrete) DoSomething(i int) error {
    m.DoSomethingCalled = true
    return nil
}

func (m *MockConcrete) DoSomethingElse() ([]int, error) {
    m.DoSomethingElseCalled = true
    return []int{}, nil
}

테스트에서 모의 ​​개체를 Concrete에 삽입하고 이를 확인할 수 있습니다. 동작:

func TestDoSomething(t *testing.T) {
    mockConcrete := &MockConcrete{}
    c := &Concrete{client: mockConcrete}

    c.DoSomething(42)

    if !mockConcrete.DoSomethingCalled {
        t.Error("DoSomething was not called")
    }
}

또 다른 기술은 모의하려는 유형을 자신의 구조체에 삽입하는 것입니다. 이를 통해 원본 개체의 다른 메서드에 대한 액세스를 유지하면서 원하는 모의 메서드를 재정의할 수 있습니다. 예를 들면 다음과 같습니다.

type Concrete struct {
    *somepackage.Client
}

이 접근 방식을 사용하면 조롱할 필요 없이 콘크리트의 DoSomethingNotNeedingMocking과 같은 재정의되지 않은 메서드를 직접 호출할 수 있습니다.

위 내용은 더 쉬운 테스트를 위해 Go에서 원숭이 패치와 같은 동작을 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.