jeudi 16 avril 2020

How to mock nested third party dependencies?

Example third party API usage:

fund doSomething(api *api.Client) {
    ...
    result, err := api.Logical().Write(val1, val2)
    ...
}

I can handle the initial call to Logical() with my own interface:

type API interface {
    Logical() *api.Logical
}

...

doSomething(&MockAPI{}) // Assuming MockAPI implements API

However, this now brings the problem into sight: the Logical() method has to have the above function signature, otherwise, I couldn't substitute the real api object in for my interface. Since the *api.Logical type is nested within the third party API library, I cannot simply mock it out with another interface:

type Writer interface {
    Write(string, string) Result, error
}

type API interface {
    Logical() *Writer
}

...

doSomething(&api.Client{}) // Doesn't implement Logical() *Writer

How would I mock this API call out so I can return custom data and not hit a live service? If it helps, this is based on an actual API.

Aucun commentaire:

Enregistrer un commentaire