如何编写单元测试json.Marshal的失败案例?

I have following code:

func policyDocumentToStr(doc map[string]interface{}) (*string, error) {
   policy, err := json.Marshal(doc)
   if err != nil {
     log.Debugf("Error converting policy document to string. Error %s", err)
     return nil, err
   }

   policyAsString := string(policy)
   return &policyAsString, nil
}

I want to write a unit test which would cover the case of json.Marshal(doc) returning an error. Can anybody suggest how can I generate an error? What kind of input to function would result in error at line policy, err := json.Marshal(doc)?

Feed it a value that cannot be represented in JSON. There are many ways to do this, including creating a type with a custom marshaler that always returns an error. But one of the simplest ways is to try to marshal a channel:

x := map[string]interface{}{
    "foo": make(chan int),
}
_, err := json.Marshal(x)
fmt.Printf("Marshal error: %s
", err)

Playground link

Define a type that implements json.Marshaler. Use this type to produce any error you want (including error values from the json package):

type FakeValue struct {
    err error
}

func (v FakeValue) MarshalJSON() ([]byte, error) {
    if v.err != nil {
            return nil, v.err
    }

    return []byte(`null`), v.err
}

func TestPolicyString(t *testing.T) {
    doc := map[string]interface{}{
            "fake_error": FakeValue{errors.New("fail!")},
    }

    _, err := policyDocumentToStr(doc)
    if err == nil {
            t.Fatal("Got nil, want error")
    }
}