Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to mock a function imported from a package in golang?

I have the following method to test, which uses a function imported from a package.

import x.y.z  func abc() {     ...     v := z.SomeFunc()     ...  } 

Is it possible to mock SomeFunc() in golang?

like image 685
Pradeep Avatar asked Mar 22 '17 12:03

Pradeep


People also ask

How do you mock an imported function?

To mock an imported function with Jest we use the jest. mock() function. jest. mock() is called with one required argument - the import path of the module we're mocking.

Can I mock a function in Golang?

The simple answer is, if your function contains API / DB call (external call), you should mock it in your test environment.

Should tests be in the same package Golang?

Test Files and Test PackagesWithin a single folder, all Go files must be in the same package. The one exception is test files: those with a _test.go suffix. There is a really good reason for that: your test files should always be in a different package.


1 Answers

Yes, with a simple refactoring. Create a zSomeFunc variable of function type, initialized with z.SomeFunc, and have your package call that instead of z.SomeFunc():

var zSomeFunc = z.SomeFunc  func abc() {     // ...     v := zSomeFunc()     // ... } 

In tests you may assign another function to zSomeFunc, one that is defined in tests, and does whatever the test wants it to.

For example:

func TestAbc(t *testing.T) {     // Save current function and restore at the end:     old := zSomeFunc     defer func() { zSomeFunc = old }()      zSomeFunc = func() int {         // This will be called, do whatever you want to,         // return whatever you want to         return 1     }      // Call the tested function     abc()      // Check expected behavior } 

See related / possible duplicate: Testing os.Exit scenarios in Go with coverage information (coveralls.io/Goveralls)

like image 55
icza Avatar answered Sep 20 '22 07:09

icza