模拟bufio外部软件包进行单元测试

I need to mock bufio Reader for testing. specifically the ReadString API.

func NewReader(rd io.Reader) *Reader
func (b *Reader) ReadString(delim byte) (string, error)

The NewReader returns bufio.Reader. Since it does not return an abstraction/interface, I cannot create a adapter for the Reader.

Could you please help.

You can always define your own interface

// An interface for the minimal api our code needs to work
type StringReader interface {
  io.Reader
  ReadString(delim byte) (string, error)
}

// Use dependency injection so that we can pass in a mock
// during testing
func DoSomething(r StringReader) error {
  _, err := r.ReadString('x')
  return err
}

// MockReader allows you to intercept calls to the
// underlying bufio.Reader
type MockReader struct {
  bufio.Reader
  ReadStringFunc func(delim byte) (string, error)
}

func (r *MockReader) ReadString(delim byte) (string, error) {
  if r.ReadStringFunc != nil {
    return r.ReadStringFunc(delim)
  }
  return r.Reader.ReadString(delim)
}

// The actual test
func TestDoSomething(t *testing.T) {
  mr := MockReader{
    Reader: bufio.NewReader(os.Stdin),
    ReadStringFunc: func(delim byte) (string, error) {
      if delim != 'x' {
        t.Fatalf("want x, got %v", delim)
      }
      return "", nil
    },
  }
  if err := DoSomething(mr); err != nil {
    t.Fatal(err)
  }
}