0
package main

import (
    "github.com/golang/mock/gomock"
    "testing"
)

type Talker interface {
    talk() string
}

type Person struct {
    moth *Talker
}

func (p *Person) speak() string {
    return (*p.moth).talk()
}

func TestPerson(t *testing.T) {
    ctrl := gomock.NewController(t)
    mockTalker := NewMockTalker(ctl)

    person := Person{moth: mockTalker}
}

假设我已经使用 mockgen 为 Talker 界面创建了一个模拟。

我在创建时遇到错误Person{moth: mockTalker}。我无法通过mockTalker

4

2 回答 2

3

不要用户指针界面。本质上接口是指针

type Person struct {
    moth Talker
}

通常,如果函数想要 return interface,它将通过指针返回新的结构。

import "fmt"

type I interface {
    M()
}

type S struct {
}

func (s *S) M() {
    fmt.Println("M")
}

func NewI() I {
    return &S{}
}

func main() {
    i := NewI()
    i.M()
}
 
于 2021-12-23T03:54:23.630 回答
1

在您的Person结构中,蛾字段是*Talker类型。它是一种指针类型的Talker接口。NewMockTalker(ctl)返回 Talker类型模拟实现。

你可以做两件事来解决这个问题。

  1. Person将'moth 字段的类型更改为Talker.
type Person struct {
    moth Talker
}

或者

  1. 将指针引用传递mockTalkerperson初始化`
person := Person{moth: &mockTalker}
于 2021-12-23T03:35:53.367 回答