如何在Golang嘲笑Kafka的依赖性和作家?

发布于 2025-02-10 23:24:46 字数 1259 浏览 3 评论 0原文

我有一个结构,

type Server struct {
    grpcServerPort  int
    grpcServer      *grpc.Server
    writer *kafka.Writer

}

该服务器有很多方法,包括 -

func NewServer(port int) *Server {
    server := &Server{
        grpcServerPort: port,
    }
    gs := grpc.NewServer()
    server.grpcServer = gs

    return server
}


func (s *Server) StartServer() {
    createKafkaTopic("brokker_url", "my_topic")

    s.writer = &kafka.Writer{
        Addr:        kafka.TCP("urls"),
        Topic:       "my_topic",
        Balancer:    &kafka.Hash{},
        MaxAttempts: 1,
        BatchSize:   1,
    }

    listener, err := net.Listen("tcp", fmt.Sprintf(":%d", s.grpcServerPort))
    if err != nil {
        fmt.Printf("failed to listen: %v", err)
    }

    go s.grpcServer.Serve(listener)
}

func (s *Server) produceEvents(key string, val string) error {

    msg := kafka.Message{
        Key:   []byte(key),
        Value: []byte(val),
    }
    err = s.writer.WriteMessages(context.Background(), msg)
    if err != nil {
        return err
    }
    return nil

}

现在方法,如果没有Kafka Brok在我的机器上启动并运行的话。我想知道如何模拟肌肉 productevents ,以便我可以为其他服务器方法编写单元测试用例。

I have a struct

type Server struct {
    grpcServerPort  int
    grpcServer      *grpc.Server
    writer *kafka.Writer

}

this Server has lot of methods including -

func NewServer(port int) *Server {
    server := &Server{
        grpcServerPort: port,
    }
    gs := grpc.NewServer()
    server.grpcServer = gs

    return server
}


func (s *Server) StartServer() {
    createKafkaTopic("brokker_url", "my_topic")

    s.writer = &kafka.Writer{
        Addr:        kafka.TCP("urls"),
        Topic:       "my_topic",
        Balancer:    &kafka.Hash{},
        MaxAttempts: 1,
        BatchSize:   1,
    }

    listener, err := net.Listen("tcp", fmt.Sprintf(":%d", s.grpcServerPort))
    if err != nil {
        fmt.Printf("failed to listen: %v", err)
    }

    go s.grpcServer.Serve(listener)
}

func (s *Server) produceEvents(key string, val string) error {

    msg := kafka.Message{
        Key:   []byte(key),
        Value: []byte(val),
    }
    err = s.writer.WriteMessages(context.Background(), msg)
    if err != nil {
        return err
    }
    return nil

}

Now createTopic method panic if no kafka broker is up and running at my machine. I want to know how to mock createTopic and produceEvents so that I can write unit test case for other methods of server.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

旧城烟雨 2025-02-17 23:24:46

您可以定义接口,然后定义模拟结构以实现它,现在您可以对其进行测试。

type Server struct {
    grpcServerPort int
    grpcServer     *grpc.Server
    writer         KafkaWriterWrapper
}

type KafkaWriterWrapper interface {
    Write(msg string) error // Suppose kafka.Writer has func Write(msg string) error
}

type KafkaWriterWrapperImpl struct {
    *kafka.Writer
}

type MockKafkaWriterWrapperImpl struct {
}

func (m *MockKafkaWriterWrapperImpl) Write(msg string) error {
    // logic
    return nil
}

you can define an interface and then define a mock struct to implement it, now you can test it.

type Server struct {
    grpcServerPort int
    grpcServer     *grpc.Server
    writer         KafkaWriterWrapper
}

type KafkaWriterWrapper interface {
    Write(msg string) error // Suppose kafka.Writer has func Write(msg string) error
}

type KafkaWriterWrapperImpl struct {
    *kafka.Writer
}

type MockKafkaWriterWrapperImpl struct {
}

func (m *MockKafkaWriterWrapperImpl) Write(msg string) error {
    // logic
    return nil
}

谷夏 2025-02-17 23:24:46

上周我刚刚遇到了你的案子。这就是我的解决方法:

type KafkaWriter interface {
    Method001fKafkaWriter()
    Method002fKafkaWriter()
}

type Server struct {
    grpcServerPort  int
    grpcServer      *grpc.Server
    writer KafkaWriter
}

现在,您可以用接口嘲笑Kafka依赖关系,

type mockKafkaWriter struct {
}

func (*mockKafkaWriter) Method001fKafkaWriter() {}
func (*mockKafkaWriter) Method002fKafkaWriter() {}

我希望这可以为您提供帮助!

I just met your case last week. And this is how I resolve that:

type KafkaWriter interface {
    Method001fKafkaWriter()
    Method002fKafkaWriter()
}

type Server struct {
    grpcServerPort  int
    grpcServer      *grpc.Server
    writer KafkaWriter
}

Now, you can mock Kafka dependencies with the interface

type mockKafkaWriter struct {
}

func (*mockKafkaWriter) Method001fKafkaWriter() {}
func (*mockKafkaWriter) Method002fKafkaWriter() {}

I hope this can help you!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文