猿问

测试返回接口的函数

我在为下面的案例编写测试时遇到了困难。


我能够使用仅实现我自己使用的功能的模拟对象为“助手”编写测试。


如何使用不模拟函数 C()、D() 的模拟对象为函数“new”编写测试代码?


可能是另一个包写得不好,它不应该返回一个接口,而是返回实际的结构?


package main


import (

    "fmt"

)


func main() {

    New()

}


func New() {

    new(NewFromEnvironment)

}


type newTopology func()(Interface,error)


// new is non-exposed simply used for testing purpose.

func new(newTopology newTopology) {

  t,_ :=  newTopology()

  helper(t)

}


// I need to call only A and B

type topologyInterface interface {

    A() string

    B() string

}


func helper(topology topologyInterface) {

    s1 := topology.A()

    s2 := topology.B()

    fmt.Println(s1 + "," + s2)

}


// Below are from other package named "topology".

// I have no control to the code below.


type Interface interface {

    A() string

    B() string

    C() string

    D() string

    //... more

}


func NewFromEnvironment() (Interface, error) {

    return P{}, nil

}


type P struct{}


func (p P) A() string {

    return "A"

}


func (p P) B() string {

    return "B"

}


func (p P) C() string {

    return "C"

}


func (p P) D() string {

    return "D"

}


// more...


qq_花开花谢_0
浏览 84回答 1
1回答

holdtom

您可以尝试创建一个MockP嵌入P. ThenMockP继承了 的所有方法P,但您可以使用自己的模拟实现来隐藏A()和。B()这是一个例子:package mainimport (    "fmt")type Interface interface {    A()    B()}type P struct {}func (p P) A() {    fmt.Println("A")}func (p P) B() {    fmt.Println("B")}type MockP struct {    P}// Shadow P's B() methodfunc (p MockP) B() {    fmt.Println("Mock B")}func main() {    var p Interface = MockP{}    p.A()    p.B()}输出:AMock B
随时随地看视频慕课网APP

相关分类

Go
我要回答