Thank you for the help @Axel Wagner On Tuesday, 28 February 2023 at 18:20:54 UTC Axel Wagner wrote:
> You are running into this: https://go.dev/doc/faq#covariant_types > > > How could I do that? > > You probably have to write a wrapper. Or change the concrete type to > return an interface. Or test using the concrete type, instead of using > mocks. > > On Tue, Feb 28, 2023 at 6:08 PM Rick Schubert <rick.s...@pod-point.com> > wrote: > >> I am having a question about how to implement interfaces correctly in Go >> when it comes to third-party packages that use chained methods. I have >> compiled an example project below for you so that you can understand the >> problem. >> >> >> package main >> >> import ( >> myAPI "github.com/hashicorp/vault/api" >> ) >> >> var myClient *myAPI.Client >> >> type MyProvider interface { >> GetClient() MyAPIClient >> } >> >> type MyAPIClient interface { >> // I want to do this but it does not work >> Logical() MyAPILogical >> // This works though >> // Logical() *myAPI.Logical >> } >> >> type MyAPILogical interface { >> Write(path string, data map[string]interface{}) (*myAPI.Secret, error) >> } >> >> type Provider struct {} >> >> func PublicFunctionIWantToTest(provider MyProvider) { >> client := provider.GetClient() >> // We normally do something here with the 'client' variable, but important >> // is that we forward it later on >> privateFunctionThatIsUsedInTheTest(client) >> } >> >> func privateFunctionThatIsUsedInTheTest(client MyAPIClient) >> (*myAPI.Secret, error) { >> return client.Logical().Write( >> "/here/goes/some/path", >> map[string]interface{}{ >> "key": "value", >> }, >> ) >> } >> >> func NewProvider() MyProvider { >> return Provider{} >> } >> >> func (p Provider) GetClient() MyAPIClient { >> return myClient >> } >> >> // Empty function just so that this example can be built >> func main() {} >> >> >> As you can see, the package has a chained method Logical().Write() . >> Since I want to create tests for PublicFunctionIWantToTest, I want to >> pass down all the functionality as interface so that I can use >> https://vektra.github.io/mockery/ to create mocks for it. >> >> Unfortunately, I am hitting an issue with my MyAPIClient and the >> MyAPILogical interface. Since I can see in the package's documentation ( >> https://pkg.go.dev/github.com/hashicorp/vault/a...@v1.8.1#Logical.Write >> <https://pkg.go.dev/github.com/hashicorp/vault/api@v1.8.1#Logical.Write>) >> that the Logical() method returns a Logical instance, I want to make it >> so that interface method returns the other interface MyAPILogical (line >> 15). This does not work though, there is an error on line 47 in the >> GetClient() method saying that I would not implement the interface >> correctly. How could I do that? >> >> cannot use myClient (variable of type *api.Client) as MyAPIClient value >> in return statement: *api.Client does not implement MyAPIClient (wrong type >> for method Logical) >> have Logical() *api.Logical >> want Logical() MyAPILogicalcompilerInvalidIfaceAssign >> >> Thank you kindly >> >> -- >> You received this message because you are subscribed to the Google Groups >> "golang-nuts" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to golang-nuts...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/1bf2aef5-14af-4565-8f4c-538a1edeb380n%40googlegroups.com >> >> <https://groups.google.com/d/msgid/golang-nuts/1bf2aef5-14af-4565-8f4c-538a1edeb380n%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/6ecb374a-e204-4069-98c8-ed2195f10945n%40googlegroups.com.