我对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{}}