add wireexample;
This commit is contained in:
29
wireexample/cmd/example_01/main.go
Normal file
29
wireexample/cmd/example_01/main.go
Normal file
@@ -0,0 +1,29 @@
|
||||
// 展示 wire 的两种 mock 实现
|
||||
|
||||
package main
|
||||
|
||||
import "fmt"
|
||||
|
||||
func main() {
|
||||
approachA()
|
||||
approachB()
|
||||
}
|
||||
|
||||
// approach A:
|
||||
// - 需要 mock 的对象定义成接口, 真正的实现和 mock 分别实现接口;
|
||||
// - injector 函数使用 接口类型参数, 测试时传入 mock 对象;
|
||||
func approachA() {
|
||||
rander := &MockRander{}
|
||||
guess := InjectGuessWithoutMock(rander)
|
||||
rander.Value = 1
|
||||
fmt.Println("approachA:", guess.Guess(10))
|
||||
}
|
||||
|
||||
// approach B:
|
||||
// - mock 和 真正的实现分别定义到两组 injector 中, injector 提供1个对象包含要测试的对象和 mock;
|
||||
// - 测试时调用 mock injector 返回对象(包含要测试的对象和 mock);
|
||||
func approachB() {
|
||||
guessWithMock := InjectMockGuess()
|
||||
guessWithMock.Mock.Value = 1
|
||||
fmt.Println("approachB:", guessWithMock.Guess.Guess(10))
|
||||
}
|
||||
64
wireexample/cmd/example_01/provider.go
Normal file
64
wireexample/cmd/example_01/provider.go
Normal file
@@ -0,0 +1,64 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
|
||||
"github.com/google/wire"
|
||||
)
|
||||
|
||||
type Rander interface {
|
||||
Rand() int
|
||||
}
|
||||
|
||||
type DefaultRander struct{}
|
||||
|
||||
func (r *DefaultRander) Rand() int {
|
||||
return rand.Int()
|
||||
}
|
||||
|
||||
func NewRander() *DefaultRander {
|
||||
return &DefaultRander{}
|
||||
}
|
||||
|
||||
type MockRander struct {
|
||||
Value int
|
||||
}
|
||||
|
||||
func (r *MockRander) Rand() int {
|
||||
return r.Value
|
||||
}
|
||||
|
||||
type Guess struct {
|
||||
rander Rander
|
||||
}
|
||||
|
||||
func (g *Guess) Guess(guess int) string {
|
||||
return fmt.Sprintf("you guess %d, real number is %d", guess, g.rander.Rand())
|
||||
}
|
||||
|
||||
func NewGuess(rander Rander) *Guess {
|
||||
return &Guess{
|
||||
rander: rander,
|
||||
}
|
||||
}
|
||||
|
||||
type GuessWithMock struct {
|
||||
Guess *Guess
|
||||
Mock *MockRander
|
||||
}
|
||||
|
||||
var GuessProviderSetWithoutMock = wire.NewSet(NewGuess)
|
||||
|
||||
var GuessProviderSet = wire.NewSet(
|
||||
NewRander,
|
||||
NewGuess,
|
||||
wire.Bind(new(Rander), new(*DefaultRander)),
|
||||
)
|
||||
|
||||
var MockGuessProviderSet = wire.NewSet(
|
||||
wire.Struct(new(MockRander)),
|
||||
NewGuess,
|
||||
wire.Bind(new(Rander), new(*MockRander)),
|
||||
wire.Struct(new(GuessWithMock), "*"),
|
||||
)
|
||||
20
wireexample/cmd/example_01/wire.go
Normal file
20
wireexample/cmd/example_01/wire.go
Normal file
@@ -0,0 +1,20 @@
|
||||
//go:build wireinject
|
||||
|
||||
package main
|
||||
|
||||
import "github.com/google/wire"
|
||||
|
||||
// Approach A
|
||||
func InjectGuessWithoutMock(rander Rander) *Guess {
|
||||
panic(wire.Build(GuessProviderSetWithoutMock))
|
||||
}
|
||||
|
||||
// Approach B
|
||||
func InjectRealGuess() *Guess {
|
||||
panic(wire.Build(GuessProviderSet))
|
||||
}
|
||||
|
||||
// Approach B
|
||||
func InjectMockGuess() *GuessWithMock {
|
||||
panic(wire.Build(MockGuessProviderSet))
|
||||
}
|
||||
33
wireexample/cmd/example_01/wire_gen.go
Normal file
33
wireexample/cmd/example_01/wire_gen.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Code generated by Wire. DO NOT EDIT.
|
||||
|
||||
//go:generate go run github.com/google/wire/cmd/wire
|
||||
//go:build !wireinject
|
||||
// +build !wireinject
|
||||
|
||||
package main
|
||||
|
||||
// Injectors from wire.go:
|
||||
|
||||
// Approach A
|
||||
func InjectGuessWithoutMock(rander Rander) *Guess {
|
||||
guess := NewGuess(rander)
|
||||
return guess
|
||||
}
|
||||
|
||||
// Approach B
|
||||
func InjectRealGuess() *Guess {
|
||||
defaultRander := NewRander()
|
||||
guess := NewGuess(defaultRander)
|
||||
return guess
|
||||
}
|
||||
|
||||
// Approach B
|
||||
func InjectMockGuess() *GuessWithMock {
|
||||
mockRander := &MockRander{}
|
||||
guess := NewGuess(mockRander)
|
||||
guessWithMock := &GuessWithMock{
|
||||
Guess: guess,
|
||||
Mock: mockRander,
|
||||
}
|
||||
return guessWithMock
|
||||
}
|
||||
Reference in New Issue
Block a user