Skip to content

mock: nested-interfaces

Back to gallery

Exhibit path: docs/examples/codegen/mock/nested-interfaces/

An interface that embeds another interface. Shows how the mock generator handles embedded interfaces: it flattens the method set and generates a single mock struct that satisfies the full embedded interface.

Input (in.go)

go
//go:build glacier_codegen_fixture

// Package rw defines read-write interfaces for streaming data.
package rw

// Reader reads bytes.
type Reader interface {
	// Read reads up to len(p) bytes into p.
	Read(p []byte) (n int, err error)
}

// ReadWriter reads, writes, and closes a byte stream.
//
// +glacier:mock
type ReadWriter interface {
	Reader

	// Write writes len(p) bytes from p.
	Write(p []byte) (n int, err error)

	// Close closes the stream.
	Close() error
}

Output (out.go)

go
//go:build glacier_codegen_fixture

// Code generated by glaciergen. DO NOT EDIT.
// Source: in.go
package rw

// MockReadWriter is a generated mock for ReadWriter.
type MockReadWriter struct {
	// OnRead is called by Read. Set this in your test to control behavior.
	OnRead func(p []byte) (n int, err error)

	// OnWrite is called by Write. Set this in your test to control behavior.
	OnWrite func(p []byte) (n int, err error)

	// OnClose is called by Close. Set this in your test to control behavior.
	OnClose func() error
}

// Read implements ReadWriter (via Reader).
func (m *MockReadWriter) Read(p []byte) (n int, err error) {
	return m.OnRead(p)
}

// Write implements ReadWriter.
func (m *MockReadWriter) Write(p []byte) (n int, err error) {
	return m.OnWrite(p)
}

// Close implements ReadWriter.
func (m *MockReadWriter) Close() error {
	return m.OnClose()
}

What the generator did

  • Found ReadWriter which embeds Reader and Writer.
  • Flattened the method set: Read, Write, and Close all appear on MockReadWriter.
  • The embedded interface is not represented as a separate mock field; the generated struct directly implements all methods. This keeps test code flat: one mock, one On* field per method.

interface-only with-types-from-other-package

Apache-2.0