// Copyright (c) Shenyang Leading Edge Intelligent Technology Co., Ltd. All rights reserved. package rpc import ( "errors" "fmt" "reflect" "strings" "testing" ) const ( float64v1 float64 = 1 float64v2 float64 = 2 float64v3 float64 = 3 float64v4 float64 = 4 float64v5 float64 = 5 float64v6 float64 = 6 float64v123 float64 = 123 float64v123dot123 float64 = 123.123 float64v456 float64 = 456 float64v10086 float64 = 10086 ) type Parameter1 struct { StringValue1 string IntegerValue1 int BooleanValue1 bool } type TestService interface { ME1(string) error ME2(string) (string, error) M1(string) error M2(string, string) error M3(int) error M4(bool) error M5(string, int, bool) error M6(string, []int) error M7(int, []string) error M8([5]int, [4]string) error M9(*bool, *[2]string, *[]int) error M10(Parameter1, *Parameter1) error M11([]Parameter1) error M12(map[string]Parameter1) error } type TestImpl struct { err error stringValue1 string stringValue2 string integerValue1 int booleanValue1 bool integerSliceValue1 []int stringSliceValue1 []string integerArray5Value1 [5]int stringArray4Value1 [4]string boolPointer1 *bool stringArray2Pointer1 *[2]string integerSlicePointer1 *[]int structValue1 Parameter1 structPointer1 *Parameter1 structArray1 []Parameter1 structMap1 map[string]Parameter1 } func (impl *TestImpl) Clear() { impl.err = nil impl.stringValue1 = "" impl.stringValue2 = "" impl.integerValue1 = 0 impl.booleanValue1 = false impl.integerSliceValue1 = nil impl.stringSliceValue1 = nil impl.integerArray5Value1 = [5]int{0, 0, 0, 0, 0} impl.stringArray4Value1 = [4]string{"", "", "", ""} impl.boolPointer1 = nil impl.stringArray2Pointer1 = nil impl.integerSlicePointer1 = nil } func (impl *TestImpl) ME1(p1 string) error { impl.stringValue1 = p1 return impl.err } func (impl *TestImpl) ME2(p1 string) (string, error) { impl.stringValue1 = p1 return "", impl.err } func (impl *TestImpl) M1(p1 string) error { impl.stringValue1 = p1 return nil } func (impl *TestImpl) M2(p1 string, p2 string) error { impl.stringValue1 = p1 impl.stringValue2 = p2 return nil } func (impl *TestImpl) M3(p1 int) error { impl.integerValue1 = p1 return nil } func (impl *TestImpl) M4(p1 bool) error { impl.booleanValue1 = p1 return nil } func (impl *TestImpl) M5(p1 string, p2 int, p3 bool) error { impl.stringValue1 = p1 impl.integerValue1 = p2 impl.booleanValue1 = p3 return nil } func (impl *TestImpl) M6(p1 string, p2 []int) error { impl.stringValue1 = p1 impl.integerSliceValue1 = p2 return nil } func (impl *TestImpl) M7(p1 int, p2 []string) error { impl.integerValue1 = p1 impl.stringSliceValue1 = p2 return nil } func (impl *TestImpl) M8(p1 [5]int, p2 [4]string) error { impl.integerArray5Value1 = p1 impl.stringArray4Value1 = p2 return nil } func (impl *TestImpl) M9(p1 *bool, p2 *[2]string, p3 *[]int) error { impl.boolPointer1 = p1 impl.stringArray2Pointer1 = p2 impl.integerSlicePointer1 = p3 return nil } func (impl *TestImpl) M10(p1 Parameter1, p2 *Parameter1) error { impl.structValue1 = p1 impl.structPointer1 = p2 return nil } func (impl *TestImpl) M11(p1 []Parameter1) error { impl.structArray1 = p1 return nil } func (impl *TestImpl) M12(p1 map[string]Parameter1) error { impl.structMap1 = p1 return nil } var testImpl = &TestImpl{} var methodInvokerBuilder = &MethodInvokerBuilder{&ValueParserBuilder{}, map[reflect.Type]ValueParser{}} func NewTestService() TestService { return testImpl } var serviceValue = reflect.ValueOf(testImpl) var serviceType = reflect.ValueOf(NewTestService).Type().Out(0) func getInvoker(methodName string) (Handler, error) { method, ok := serviceType.MethodByName(methodName) if !ok { return nil, errors.New(fmt.Sprintf("未找到方法!")) } serviceName := strings.ToLower(fmt.Sprintf("%s.%s", serviceType.Name(), methodName)) methodInvoker, err := methodInvokerBuilder.buildMethodInvoker(serviceName, method.Type, serviceValue.MethodByName(methodName).Call) if err != nil { return nil, err } return methodInvoker, nil } func getInvokerMapping() (map[string]Handler, error) { mapping := make(map[string]Handler, serviceType.NumMethod()) for i := 0; i < serviceType.NumMethod(); i++ { method := serviceType.Method(i) methodInvoker, err := getInvoker(method.Name) if err != nil { return nil, err } mapping[strings.ToLower(fmt.Sprintf("/testservice/%s", method.Name))] = methodInvoker } return mapping, nil } func TestError(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() testImpl.err = errors.New("error1") parameters := []interface{}{ "small", } _, err := invokerMapping["/testservice/me1"].Process(parameters) if err != testImpl.err { t.Fatalf("意外错误:%s", err.Error()) } } { testImpl.Clear() testImpl.err = errors.New("error2") parameters := []interface{}{ "small", } _, err := invokerMapping["/testservice/me2"].Process(parameters) if err != testImpl.err { t.Fatalf("意外错误:%s", err.Error()) } } } func TestParameterCount(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ "small", "big", } _, err := invokerMapping["/testservice/m1"].Process(parameters) if err == nil { t.Fatalf("意外的没有错误!") } if err.Error() != "参数长度错误!" { t.Fatalf("意外错误:%s", err.Error()) } } } func TestString(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ "small", } _, err := invokerMapping["/testservice/m1"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.stringValue1 != "small" { t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1) } } { testImpl.Clear() parameters := []interface{}{ "small", "big", } _, err := invokerMapping["/testservice/m2"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.stringValue1 != "small" { t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1) } if testImpl.stringValue2 != "big" { t.Fatalf("stringValue2实际值为:%s", testImpl.stringValue1) } } { testImpl.Clear() parameters := []interface{}{ "small", nil, } _, err := invokerMapping["/testservice/m2"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.stringValue1 != "small" { t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1) } if testImpl.stringValue2 != "" { t.Fatalf("stringValue2实际值为:%s", testImpl.stringValue1) } } { testImpl.Clear() parameters := []interface{}{ "small", []interface{}{}, } _, err := invokerMapping["/testservice/m2"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#2 无法解析!源类型:[]interface {},目标类型:String." { t.Fatalf("意外错误%s", err.Error()) } } } func TestNumber(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ float64v123, } _, err := invokerMapping["/testservice/m3"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerValue1 != 123 { t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1) } } { testImpl.Clear() mapping := []interface{}{ float64v123dot123, } _, err := invokerMapping["/testservice/m3"].Process(mapping) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerValue1 != 123 { t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1) } } } func TestBoolean(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ true, } _, err := invokerMapping["/testservice/m4"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if !testImpl.booleanValue1 { t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1) } } { testImpl.Clear() parameters := []interface{}{ false, } _, err := invokerMapping["/testservice/m4"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.booleanValue1 { t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1) } } } func TestSimpleValue(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ "small", float64v123, true, } _, err := invokerMapping["/testservice/m5"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.stringValue1 != "small" { t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1) } if testImpl.integerValue1 != 123 { t.Fatalf("integerValue1实际值为:%d", testImpl.integerValue1) } if !testImpl.booleanValue1 { t.Fatalf("booleanValue1实际值为:%t", testImpl.booleanValue1) } } } func TestSlice(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ "small", []interface{}{ float64v1, float64v2, float64v3, }, } _, err := invokerMapping["/testservice/m6"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.stringValue1 != "small" { t.Fatalf("stringValue1实际值为:%s", testImpl.stringValue1) } if len(testImpl.integerSliceValue1) != 3 { t.Fatalf("integerSliceValue1实际长度为:%d", len(testImpl.integerSliceValue1)) } if testImpl.integerSliceValue1[0] != 1 { t.Fatalf("integerSliceValue1#0实际值为:%d", testImpl.integerSliceValue1[0]) } if testImpl.integerSliceValue1[1] != 2 { t.Fatalf("integerSliceValue1#1实际值为:%d", testImpl.integerSliceValue1[1]) } if testImpl.integerSliceValue1[2] != 3 { t.Fatalf("integerSliceValue1#2实际值为:%d", testImpl.integerSliceValue1[2]) } } { testImpl.Clear() parameters := []interface{}{ float64v10086, []interface{}{ "small", "big", }, } _, err := invokerMapping["/testservice/m7"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerValue1 != 10086 { t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1) } if len(testImpl.stringSliceValue1) != 2 { t.Fatalf("istringSliceValue1实际长度为:%d", len(testImpl.stringSliceValue1)) } if testImpl.stringSliceValue1[0] != "small" { t.Fatalf("stringSliceValue1#0实际值为:%s", testImpl.stringSliceValue1[0]) } if testImpl.stringSliceValue1[1] != "big" { t.Fatalf("stringSliceValue1#1实际值为:%s", testImpl.stringSliceValue1[1]) } } } func TestArray(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ []interface{}{ float64v5, float64v4, float64v3, float64v2, float64v1, }, []interface{}{ "A", "B", "C", "D", }, } _, err := invokerMapping["/testservice/m8"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerArray5Value1[0] != 5 { t.Fatalf("integerArray5Value1#0实际值为:%d", testImpl.integerArray5Value1[0]) } if testImpl.integerArray5Value1[1] != 4 { t.Fatalf("integerArray5Value1#1实际值为:%d", testImpl.integerArray5Value1[1]) } if testImpl.integerArray5Value1[2] != 3 { t.Fatalf("integerArray5Value1#2实际值为:%d", testImpl.integerArray5Value1[2]) } if testImpl.integerArray5Value1[3] != 2 { t.Fatalf("integerArray5Value1#3实际值为:%d", testImpl.integerArray5Value1[3]) } if testImpl.integerArray5Value1[4] != 1 { t.Fatalf("integerArray5Value1#4实际值为:%d", testImpl.integerArray5Value1[4]) } if testImpl.stringArray4Value1[0] != "A" { t.Fatalf("stringArray4Value1#1实际值为:%s", testImpl.stringArray4Value1[0]) } if testImpl.stringArray4Value1[1] != "B" { t.Fatalf("stringArray4Value1#2实际值为:%s", testImpl.stringArray4Value1[1]) } if testImpl.stringArray4Value1[2] != "C" { t.Fatalf("stringArray4Value1#3实际值为:%s", testImpl.stringArray4Value1[2]) } if testImpl.stringArray4Value1[3] != "D" { t.Fatalf("stringArray4Value1#4实际值为:%s", testImpl.stringArray4Value1[3]) } } { testImpl.Clear() parameters := []interface{}{ []interface{}{ float64v6, float64v5, float64v4, float64v3, float64v2, float64v1, }, []interface{}{ "A", "B", "C", "D", }, } _, err := invokerMapping["/testservice/m8"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#1 数组长度匹配!期望长度:5,实际长度:6." { t.Fatalf("意外错误%s", err.Error()) } } } func TestPointer(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ []interface{}{ float64v5, float64v4, float64v3, float64v2, float64v1, }, []interface{}{ "A", "B", "C", "D", }, } _, err := invokerMapping["/testservice/m8"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerArray5Value1[0] != 5 { t.Fatalf("integerArray5Value1#0实际值为:%d", testImpl.integerArray5Value1[0]) } if testImpl.integerArray5Value1[1] != 4 { t.Fatalf("integerArray5Value1#1实际值为:%d", testImpl.integerArray5Value1[1]) } if testImpl.integerArray5Value1[2] != 3 { t.Fatalf("integerArray5Value1#2实际值为:%d", testImpl.integerArray5Value1[2]) } if testImpl.integerArray5Value1[3] != 2 { t.Fatalf("integerArray5Value1#3实际值为:%d", testImpl.integerArray5Value1[3]) } if testImpl.integerArray5Value1[4] != 1 { t.Fatalf("integerArray5Value1#4实际值为:%d", testImpl.integerArray5Value1[4]) } if testImpl.stringArray4Value1[0] != "A" { t.Fatalf("stringArray4Value1#1实际值为:%s", testImpl.stringArray4Value1[0]) } if testImpl.stringArray4Value1[1] != "B" { t.Fatalf("stringArray4Value1#2实际值为:%s", testImpl.stringArray4Value1[1]) } if testImpl.stringArray4Value1[2] != "C" { t.Fatalf("stringArray4Value1#3实际值为:%s", testImpl.stringArray4Value1[2]) } if testImpl.stringArray4Value1[3] != "D" { t.Fatalf("stringArray4Value1#4实际值为:%s", testImpl.stringArray4Value1[3]) } } { testImpl.Clear() parameters := []interface{}{ false, []interface{}{ "A", "B", }, []interface{}{ float64v123, float64v456, }, } _, err := invokerMapping["/testservice/m9"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.boolPointer1 == nil { t.Fatal("boolPointer1不应为空!") } if *testImpl.boolPointer1 { t.Fatalf("booleanValue1实际值为:%t", *testImpl.boolPointer1) } if testImpl.integerSlicePointer1 == nil { t.Fatal("integerSlicePointer1不应为空!") } stringArray2 := *testImpl.stringArray2Pointer1 if stringArray2[0] != "A" { t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0]) } if stringArray2[1] != "B" { t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1]) } if testImpl.stringArray2Pointer1 == nil { t.Fatal("tringArray2Pointer1不应为空!") } integerSlic := *testImpl.integerSlicePointer1 if integerSlic[0] != 123 { t.Fatalf("integerSlicePointer1#0实际值为:%d", integerSlic[0]) } if integerSlic[1] != 456 { t.Fatalf("integerSlicePointer1#1实际值为:%d", integerSlic[1]) } } } func TestNil(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ nil, []interface{}{ "A", "B", }, nil, } _, err := invokerMapping["/testservice/m9"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.boolPointer1 != nil { t.Fatal("boolPointer1应当为空!") } if testImpl.stringArray2Pointer1 == nil { t.Fatal("stringArray2Pointer1不应为空!") } stringArray2 := *testImpl.stringArray2Pointer1 if stringArray2[0] != "A" { t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0]) } if stringArray2[1] != "B" { t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1]) } if testImpl.integerSlicePointer1 != nil { t.Fatal("integerSlicePointer1不应为空!") } } { testImpl.Clear() parameters := []interface{}{ nil, []interface{}{ "A", "B", }, nil, } _, err := invokerMapping["/testservice/m9"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.boolPointer1 != nil { t.Fatal("boolPointer1应当为空!") } if testImpl.stringArray2Pointer1 == nil { t.Fatal("stringArray2Pointer1不应为空!") } stringArray2 := *testImpl.stringArray2Pointer1 if stringArray2[0] != "A" { t.Fatalf("stringArray2Pointer1#0实际值为:%s", stringArray2[0]) } if stringArray2[1] != "B" { t.Fatalf("stringArray2Pointer1#1实际值为:%s", stringArray2[1]) } if testImpl.integerSlicePointer1 != nil { t.Fatal("integerSlicePointer1不应为空!") } } { testImpl.Clear() parameters := []interface{}{ float64v10086, nil, } _, err := invokerMapping["/testservice/m7"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerValue1 != 10086 { t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1) } if testImpl.stringSliceValue1 != nil { t.Fatal("boolPointer1应当为空!") } } { testImpl.Clear() parameters := []interface{}{ float64v10086, nil, } _, err := invokerMapping["/testservice/m7"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.integerValue1 != 10086 { t.Fatalf("stringValue1实际值为:%d", testImpl.integerValue1) } if testImpl.stringSliceValue1 != nil { t.Fatal("boolPointer1应当为空!") } } { testImpl.Clear() parameters := []interface{}{ nil, } _, err := invokerMapping["/testservice/m4"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#1 不能为空!" { t.Fatalf("意外错误%s", err.Error()) } } { testImpl.Clear() parameters := []interface{}{ nil, } _, err := invokerMapping["/testservice/m3"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#1 不能为空!" { t.Fatalf("意外错误%s", err.Error()) } } { testImpl.Clear() parameters := []interface{}{ []interface{}{ float64v5, float64v4, float64v3, float64v2, float64v1, }, nil, } _, err := invokerMapping["/testservice/m8"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#2 不能为空!" { t.Fatalf("意外错误%s", err.Error()) } } } func TestStruct(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ map[string]interface{}{ "StringValue1": "A", "IntegerValue1": float64v1, "BooleanValue1": true, }, map[string]interface{}{ "StringValue1": "B", "IntegerValue1": float64v2, "BooleanValue1": false, }, } _, err := invokerMapping["/testservice/m10"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.structValue1.StringValue1 != "A" { t.Fatalf("structValue1.StringValue1实际值为:%s", testImpl.structValue1.StringValue1) } if testImpl.structValue1.IntegerValue1 != 1 { t.Fatalf("structValue1.IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1) } if !testImpl.structValue1.BooleanValue1 { t.Fatalf("structValue1.BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1) } if testImpl.structPointer1.StringValue1 != "B" { t.Fatalf("structPointer1.StringValue1实际值为:%s", testImpl.structPointer1.StringValue1) } if testImpl.structPointer1.IntegerValue1 != 2 { t.Fatalf("structPointer1.IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1) } if testImpl.structPointer1.BooleanValue1 { t.Fatalf("structPointer1.BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1) } } { testImpl.Clear() parameters := []interface{}{ map[string]interface{}{ "StringValue1": "A", "IntegerValue1": float64v1, "BooleanValue1": true, }, nil, } _, err := invokerMapping["/testservice/m10"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.structValue1.StringValue1 != "A" { t.Fatalf("structValue1.StringValue1实际值为:%s", testImpl.structValue1.StringValue1) } if testImpl.structValue1.IntegerValue1 != 1 { t.Fatalf("structValue1.IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1) } if !testImpl.structValue1.BooleanValue1 { t.Fatalf("structValue1.BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1) } if testImpl.structPointer1 != nil { t.Fatal("structPointer1应当为空!") } } { testImpl.Clear() parameters := []interface{}{ nil, map[string]interface{}{ "StringValue1": "B", "IntegerValue1": float64v2, "BooleanValue1": false, }, } _, err := invokerMapping["/testservice/m10"].Process(parameters) if err == nil { t.Fatal("意外没有错误!") } if err.Error() != "#1 不能为空!" { t.Fatalf("意外错误%s", err.Error()) } } { testImpl.Clear() parameters := []interface{}{ []interface{}{ map[string]interface{}{ "StringValue1": "A", "IntegerValue1": float64v1, "BooleanValue1": true, }, map[string]interface{}{ "StringValue1": "B", "IntegerValue1": float64v2, "BooleanValue1": false, }, }, } _, err := invokerMapping["/testservice/m11"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.structArray1 == nil { t.Fatal("structArray1不应为空!") } if len(testImpl.structArray1) != 2 { t.Fatalf("structArray1实际长度为:%d", len(testImpl.integerSliceValue1)) } if testImpl.structArray1[0].StringValue1 != "A" { t.Fatalf("structArray1[0].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1) } if testImpl.structArray1[0].IntegerValue1 != 1 { t.Fatalf("structArray1[0].IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1) } if !testImpl.structArray1[0].BooleanValue1 { t.Fatalf("structArray1[0].BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1) } if testImpl.structArray1[1].StringValue1 != "B" { t.Fatalf("structArray1[1].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1) } if testImpl.structArray1[1].IntegerValue1 != 2 { t.Fatalf("structArray1[1].IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1) } if testImpl.structArray1[1].BooleanValue1 { t.Fatalf("structArray1[1].BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1) } } } func TestMap(t *testing.T) { invokerMapping, err := getInvokerMapping() if err != nil { t.Fatalf("意外错误:%s", err.Error()) } { testImpl.Clear() parameters := []interface{}{ map[string]interface{}{ "key1": map[string]interface{}{ "StringValue1": "A", "IntegerValue1": float64v1, "BooleanValue1": true, }, "key2": map[string]interface{}{ "StringValue1": "B", "IntegerValue1": float64v2, "BooleanValue1": false, }, }, } _, err := invokerMapping["/testservice/m12"].Process(parameters) if err != nil { t.Fatalf("意外错误:%s", err.Error()) } if testImpl.structMap1 == nil { t.Fatal("structMap1不应为空!") } if len(testImpl.structMap1) != 2 { t.Fatalf("structMap1实际长度为:%d", len(testImpl.integerSliceValue1)) } if testImpl.structMap1["key1"].StringValue1 != "A" { t.Fatalf("structMap1[\"key1\"].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1) } if testImpl.structMap1["key1"].IntegerValue1 != 1 { t.Fatalf("structMap1[\"key1\"].IntegerValue1实际值为:%d", testImpl.structValue1.IntegerValue1) } if !testImpl.structMap1["key1"].BooleanValue1 { t.Fatalf("structMap1[\"key1\"].BooleanValue1实际值为:%t", testImpl.structValue1.BooleanValue1) } if testImpl.structMap1["key2"].StringValue1 != "B" { t.Fatalf("structMap1[\"key2\"].StringValue1实际值为:%s", testImpl.structPointer1.StringValue1) } if testImpl.structMap1["key2"].IntegerValue1 != 2 { t.Fatalf("structMap1[\"key2\"].IntegerValue1实际值为:%d", testImpl.structPointer1.IntegerValue1) } if testImpl.structMap1["key2"].BooleanValue1 { t.Fatalf("structMap1[\"key2\"].BooleanValue1实际值为:%t", testImpl.structPointer1.BooleanValue1) } } }