package main import "testing" // 测试替身:只提供接口需要的方法,不依赖真实 Student 或 Teacher。 type fakeIntroducer struct { text string } func (fake fakeIntroducer) Introduce() string { return fake.text } func TestIntroduction(t *testing.T) { fake := fakeIntroducer{text: "固定测试内容"} got := introduction(fake) if got != fake.text { t.Fatalf("实际=%q,期望=%q", got, fake.text) } } func TestImplementations(t *testing.T) { tests := []struct { name string person Introducer want string }{ {name: "student", person: Student{Name: "小朱"}, want: "我是学生:小朱"}, {name: "teacher", person: Teacher{Name: "王老师", Subject: "Go"}, want: "我是老师:王老师,教授Go"}, {name: "assistant", person: &Assistant{Name: "小陈"}, want: "我是助教:小陈"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { if got := introduction(tt.person); got != tt.want { t.Errorf("实际=%q,期望=%q", got, tt.want) } }) } } func TestInterfaceNil(t *testing.T) { var empty Introducer if empty != nil { t.Fatal("未赋值接口应为 nil") } var assistant *Assistant var person Introducer = assistant if person == nil { t.Fatal("包含具体类型的 nil 指针接口不应等于 nil") } if got := person.Introduce(); got != "助教信息为空" { t.Errorf("nil 助教的介绍不符合预期:%q", got) } }