monkey

package module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 22, 2022 License: MIT Imports: 7 Imported by: 0

README

Go语言猴子补丁框架 🙉 🐒

test workflow

Go 语言猴子补丁(monkey patching)框架。

本项目对 Bouke 的项目做了优化,不同协程可以独立 patch 同一个函数而互不影响。从而可以并发运行单元测试。

工作原理请参考我的系列文章:

Bouke 已经不再维护原项目,所以只能开一个新项目了🤣。

有兴趣的同学也可以加微信 taoshu-in 讨论,拉你进群。

快速入门

首先,引入 monkey 包

go get github.com/go-kiss/monkey

然后,调用 monkey.Patch 方法 mock 指定函数。

package main

import (
	"fmt"

	"github.com/go-kiss/monkey"
)

func sum(a, b int) int { return a + b }

func main() {
	monkey.Patch(sum, func(a b int) int { return a - b })
	fmt.Println(sum(1,2)) // 输出 -1
}

更多用法请参考使用示例测试用例

注意事项

  1. Monkey 需要关闭 Go 语言的内联优化才能生效,比如测试的时候需要:go test -gcflags=-l
  2. Monkey 需要在运行的时候修改内存代码段,因而无法在一些对安全性要求比较高的系统上工作。
  3. Monkey 不应该用于生产系统,但用来 mock 测试代码还是没有问题的。
  4. Monkey 目前仅支持 amd64 指令架构。支持 linux 和 macos。目前 windows 平台还有问题。

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func PatchEmpty

func PatchEmpty(target interface{})

PatchEmpty patches target with empty patch. Call the target will run the original func.

func Unpatch

func Unpatch(target interface{}) bool

Unpatch removes any monkey patches on target returns whether target was patched in the first place

func UnpatchAll

func UnpatchAll()

UnpatchAll removes all applied monkeypatches

func UnpatchInstanceMethod

func UnpatchInstanceMethod(target reflect.Type, methodName string) bool

UnpatchInstanceMethod removes the patch on methodName of the target returns whether it was patched in the first place

Types

type PatchGuard

type PatchGuard struct {
	// contains filtered or unexported fields
}

func Patch

func Patch(target, replacement interface{}) *PatchGuard

Patch replaces a function with another

func PatchInstanceMethod

func PatchInstanceMethod(target reflect.Type, methodName string, replacement interface{}) *PatchGuard

PatchInstanceMethod replaces an instance method methodName for the type target with replacement Replacement should expect the receiver (of type target) as the first argument

func (*PatchGuard) Restore

func (g *PatchGuard) Restore()

func (*PatchGuard) Unpatch

func (g *PatchGuard) Unpatch()

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL