title: Mock inner function in golang
body: <p>I want to mock function using interface and I was able to mock the first function <code>callsomething</code>
  With great help from <code>icza</code> , Now it’s a bit more tricky . I want to test function <code>vl1</code> 
  With <strong>mock for function</strong> <code>function1</code> , how it can be done.</p>
  
  <p><a href="https://play.golang.org/p/w367IOjADFV" rel="nofollow noreferrer">https://play.golang.org/p/w367IOjADFV</a></p>
  
  <p>package main</p>
  
  <pre><code>import (
      "fmt"
      "time"
      "testing"
  )
  
  type vInterface interface {
      function1() bool
  }
  
  type mStruct struct {
      info string
      time time.Time
  }
  
  func (s *mStruct) function1() bool {
      return true
  }
  
  func callSomething(si vInterface) bool {
      return si.function1()
  }
  
  func (s *mStruct) vl1() bool {
      return callSomething(s)
  }
  
  var currentVt1 mStruct
  
  func main() {
      vl1 := currentVt1.vl1()
  
      fmt.Println(vl1)
  }
  
  //——————————————————TESTS——————————————————
  
  // This test is working as expected (as suggested by icza) for the function  "callSomething"
  // here we use mock interface and mock function which helps to mock function1
  type mockedVInterface struct {
      value bool
  }
  
  func (m mockedVInterface) fn1() bool {
      return m.value
  }
  
  func Test_callSomething(t *testing.T) {
  
  
  
      type args struct {
          si vInterface
      }
      tests := []struct {
          name string
          args args
          want bool
      }{
          {
              name: "first value",
              args: args{
                  si: mockedVInterface{value: false},
              },
              want: false,
          },
          {
              name: "second value",
              args: args{
                  si: mockedVInterface{value: true},
              },
              want: true,
          },
      }
      for _, tt := range tests {
          t.Run(tt.name, func(t *testing.T) {
              if got := callSomething(tt.args.si); got != tt.want {
                  t.Errorf("callSomething() = %v, want %v", got, tt.want)
              }
          })
      }
  }
  
  
  
  //----Here is the test which a bit tricky 
  //I want to call to "s.vl1()" and test it with mock for "function1"
  
  func Test_mStruct_vl1(t *testing.T) {
      type fields struct {
          info string
          time time.Time
      }
      tests := []struct {
          name   string
          fields fields
          want   bool
      }{
          {
              name: "test 2",
              fields: struct {
                  info string
                  time time.Time
              }{info: "myinfo", time: time.Now() },
  
          },
      }
      for _, tt := range tests {
          t.Run(tt.name, func(t *testing.T) {
              s := &amp;mStruct{
                  info: tt.fields.info,
                  time: tt.fields.time,
              }
              //here the test is starting
              if got := s.vl1(); got != tt.want {
                  t.Errorf("mStruct.vl1() = %v, want %v", got, tt.want)
              }
          })
      }
  }
  </code></pre>