2017-03-16 3 views
1

나는 골란에 대해 상당히 새로운 지식을 가지고 있으며, 간단한 작업으로 어려움을 겪고 있습니다.골란에서 특정 방법만을 모의 사용하는 방법

나는 golang

type struct A { 
} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s *A) getSecond() { 
    // do something 
} 

에 다음과 같은 클래스가 그리고 나는 그러나 내가 getSecond()을 재정의 할 필요가하기에 대한 몇 가지 테스트를 작성하고자합니다. 내 테스트 파일

type Ai interface { 
    getSecond() 
} 

type testA struct { 
    A 
} 

func (s *testA) getSecond() { 
    // do nothing 
} 

func TestA(t *testing.T) { 
    a := &A{} 
    t := &testA{A: a} 
    t.GetFirst() 
} 

여기 아이디어는 그러나이 작동하지 않는 내장 사용하여 인터페이스를 재정의 할 getSecond() 방법을 노출하는 것입니다에서 다음을 수행하려고했습니다. 테스트는 여전히 나의 조롱 한 대신 getSecond()의 원래 구현을 호출합니다.

하나 개의 솔루션은 물론 getFirst()getSecond() 다음 테스트에 구현하는 구조체를 생성을 포함하는 A의 적절한 인터페이스를 생성하는 것 모두 getFirst() 호출 원래 구현 및 getSecond() 더미 그러나 나는 이것이 복잡하지 느끼는 경우 일을하는 올바른 방법.

또 다른 가능성은 실제 구현의 getSecond()을 변수에 할당하고 테스트에서 변수를 무시하는 것일 수 있습니다.하지만 단순한 무시를 위해이 작업을 수행하는 것이 조금 이상하다고 생각할 수도 있습니다.

나는 이것에 대해 완전히 잘못 알고 있습니까? golang을 사용하여이 작업을 수행하는 간단한 방법이 있습니까?

+0

는 왜 두 방법 중 하나를 조롱하고 싶어 다른 구현을 가지고? 진짜 이유는 무엇입니까? 정말 잘 작동하는 것은 :'모든'내부에 접근 할 수있는 것처럼 쉬운 'A'를 만들고,'getFirst()'와'getSecond()'가 원하는 결과를 생성하는지 확인하십시오. 린스하고 반복하십시오. 표준 라이브러리를 살펴보십시오. 어쩌면 당신은 여전히 ​​다른 언어의 영향을 받고 있으며'getFirst()'는'getSecond()'를 사용하여'getSecond()'를 조롱해야한다고 생각하게 만듭니다. 아니요,'getSecond()'가'A'의 상태를 통해 무엇을하는지 제어 할 수 있습니다. 그리고 제발 : Goter에는 getter가 없습니다 (golang이 아닙니다). – Volker

+0

실제로 getters는 게터가 아니며 예제에서 그 함수의 이름을 지정하기로했습니다. getFirst는 단위 테스트 상황에서 작동하지 않는 물건을 수행하는 getSecond를 호출합니다. – ByteFlinger

+0

더 정확하게 말하십시오. A에는 baseUrl이 있고 getFirst()는 http 요청을 수행하지만 요청하기 전에 url 기본 도메인을 다시 작성하여 getdomain (getSecond()가 수행하는 작업)에 따라 하위 도메인을 포함해야합니다. 이로 인해 http : //subdomain.127.0.0.1로 끝나는 httptest 패키지에서 문제가 발생합니다. – ByteFlinger

답변

1

this answer에 따라 golang의 메서드를 실제로 재정의 할 수 없습니다. 그러나 "getSecond 메서드"에 대한 별도의 인터페이스를 가질 수 있으며 테스트 사례에 하나의 구현을, 실제 코드에 하나의 구현을 가질 수 있다고 지적했습니다. 시험에서 다음

type s interface{ 
    getSecond() 
} 

type A struct{ 
    s 
} 

type a struct{ 

} 

func (s *A) GetFirst() { 
    s.getSecond() 
} 

func (s a) getSecond() { 
    // do something 
} 

//Use a 
A{a{}} 

'는이'

type struct ta { 

} 
func (s ta) getSecond() { 
    // do nothing 
} 

A{ta{}} 
+0

내 질문에 내가 제공 한 데이터의 양을 감안할 때 이것이 받아 들일 수있는 해결책이라고 생각합니다. Volker가 모든 것을 풀로 붙이기 위해 사용되는 방법을 테스트하지 않고 살 수 있고 여분의 로직을 추가하지 않으면 내 질문 아래에 댓글에 게시 된 내용이 있습니다. – ByteFlinger

관련 문제