2017-10-25 7 views
2

실제 브로커를 설정하지 않고 sarama-cluster의 NewConsumer 기능을 테스트/모의 할 수있는 방법이 있습니까? 내가 여기서 무엇을 놓치고 있니?sarama-cluster의 NewConsumer를 조롱

코드 내가 테스트를 시도하고는 :

import cluster "github.com/bsm/sarama-cluster" 

func initSaramaConsumer() (*cluster.Consumer, error) { 
    brokers := []string{"some_url:port"} 
    groups := "some_group" 
    topics := []string{"some_topic"} 
    config := cluster.NewConfig() 

    saramaConsumer, err := cluster.NewConsumer(
    brokers, groups, topics, config, 
) 

    if err != nil { 
    return nil, err 
    } 

    return saramaConsumer, nil 
} 

답변

1

cluster.NewConsumer를 호출하지만 테스트에서 교환 할 수있는 간단한 간접를 추가하지 마십시오. 예를 들어, 함수를 패키지 변수에 할당하십시오 (저는 time.Now로 이것을 수행합니다).

package main 

import (
    "testing" 

    "github.com/bsm/sarama-cluster" 
) 

var newConsumer = cluster.NewConsumer // replaceable in tests 

func initSaramaConsumer() (*cluster.Consumer, error) { 
    brokers := []string{"some_url:port"} 
    groups := "some_group" 
    topics := []string{"some_topic"} 
    config := cluster.NewConfig() 

    saramaConsumer, err := newConsumer(
      brokers, groups, topics, config, 
    ) 

    if err != nil { 
      return nil, err 
    } 

    return saramaConsumer, nil 
} 

func TestInitSaramaConsumer(t *testing.T) { 
    newConsumer = newMockConsumer 
    defer func() { newConsumer = cluster.NewConsumer }() 

    // Tests for initSaramaConsumer goes here 
} 

func newMockConsumer([]string, string, []string, *cluster.Config) (*cluster.Consumer, error) { 
    panic("not implemented") 
} 
+0

답변 해 주셔서 감사합니다. '* testing.T'와 함께 작동하지만''은행 나무'테스트 프레임 워크를 사용하고 있다는 것을 잊어 버렸습니다. 리팩터링을 사용하여 테스트를 작성할 수 있습니까? – ntfx

+1

프레임 워크는 중요하지 않습니다. 나는 그 개념을 설명하고있다. 은행 나무에는 BeforeEach()와 AfterEach()가 있습니다. – Peter

+0

* 마음이 날려 * 예, 작동합니다! 고마워, 피터, 나는 이것에 관해 많은 것을 배웠던 것처럼 느낀다! – ntfx