我对golang相当陌生,并且正在为一个简单的任务而苦苦挣扎。

我在戈朗有以下类(class)

type struct A {
}

func (s *A) GetFirst() {
    s.getSecond()
}

func (s *A) getSecond() {
    // do something
}

我想为此编写一些测试,但是为此我需要重写getSecond()。我试图在测试文件中执行以下操作
type Ai interface {
    getSecond()
}

type testA struct {
    A
}

func (s *testA) getSecond() {
     // do nothing
}

func TestA(t *testing.T) {
   a := &A{}
   t := &testA{A: a}
   t.GetFirst()
}

这里的想法是将getSecond()方法暴露给接口(interface)并通过使用嵌入进行覆盖,但这似乎不起作用。该测试仍然调用getSecond()的原始实现,而不是我模拟的实现。

一种解决方案当然是为A创建一个包含getFirst()getSecond()的适当接口(interface),然后在测试中创建一个结构,以实现getFirst()调用原始实现和getSecond()一个虚拟对象,但是我觉得这很麻烦,而且不是正确的方法做着东西。

另一种可能性是在实际实现中将getSecond()分配给一个变量,并在测试中覆盖该变量,但我也感到仅出于简单覆盖的目的执行此操作有点奇怪。

我对此有错吗?有什么简单的方法可以使用golang做到这一点吗?

最佳答案

您实际上无法按照this answer覆盖golang中的方法。但是,正如您指出的那样,您可以为“getSecond方法”使用一个单独的接口(interface),并在测试用例中使用一种实现,而在实际代码中使用一种实现。

type s interface{
    getSecond()
}

type A struct{
    s
}

type a struct{

}

func (s *A) GetFirst() {
    s.getSecond()
}

func (s a) getSecond() {
    // do something
}

//Use a
A{a{}}
然后在测试中使用不同的“a”实现
type ta struct {

}
func (s ta) getSecond() {
    // do nothing
}

A{ta{}}

07-28 07:22