test/store.go
package test
import (
"bufio"
"encoding/json"
"io"
"os"
)
type Monster struct {
Name string `json:"name"`
Age int `json:"age"`
Skill string `json:"skill""`
}
// 将Monster对象序列化后保存到文件
func (monster *Monster) Store(fileName string) (bool, error) {
// 将Monster 对象序列化为一个字符串
data, err := json.Marshal(monster)
if err != nil {
return false, err
}
dataStr := string(data)
// 将字符串写入指定的文件
file, err := os.OpenFile(fileName, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0666)
if err != nil {
return false, err
}
defer file.Close() // 不要忘了在结束时关闭句柄,释放资源
writer := bufio.NewWriter(file)
writer.WriteString(dataStr)
writer.Flush() // 不要忘了将缓存数据写入磁盘(持久化)
return true, nil
}
// 将指定文件中的内容反序列化为Monster对象
func (monster *Monster) ReStore(fileName string) (bool, error) {
// 读取指定文件的内容
file, err := os.Open(fileName)
if err != nil {
return false, err
}
defer file.Close()
reader := bufio.NewReader(file)
var str string
for {
str2, err := reader.ReadString('\n')
str += str2
if err == io.EOF {
break
}
if err != nil && err != io.EOF {
return false, err
}
}
// 将读取的内容反序列化为Monster对象
if json.Unmarshal([]byte(str), monster) != nil {
return false, err
}
return true, nil
}
/test/store_test.go
package test
import (
"fmt"
"testing"
)
func TestMonster_Store(t *testing.T) {
var monster Monster
monster = Monster{
Name: "tom",
Age: 32,
Skill: "学习",
}
ok, err := monster.Store("d:/testJsonMarshal.txt")
if !ok {
fmt.Println("序列化方法失败:", err)
t.Fatalf("序列化方法monster.Store()测试失败:%v\n", err)
} else {
t.Log("序列化方法monster.Store()测试正确,请核对d:/testJsonMarshal.txt文件的内容")
}
}
func TestMonster_ReStore(t *testing.T) {
var monster Monster
ok, err := monster.ReStore("d:/testJsonMarshal.txt")
if ok {
t.Logf("反序列化方法monster.ReStore()测试正确,请核对:monster = %v", monster)
} else {
t.Fatalf("反序列化方法monster.ReStore()测试失败:%v\n", err)
}
}
执行结果:
单个方法测试:
- 全局中自动搜索方法执行
- 明确指定文件,缩小范围查找,降低测试引擎的搜索开销
单个文件测试:
- 第一个go文件是需要执行的测试文件,第二个go文件是需要测试的源程序