You can use an unexported package variable pointing to the time.Now function.
var (
timeNow = time.Now
timeAfter = time.After
)
// ...
type Obj struct{}
func (o Obj) TimeCriticalFunc(d time.Duration) bool {
// Call timeAfter and timeNow.
}
And in your tests do
func TestTimeCriticalFunc(t *testing.T) {
timeNow = func() time.Time {
return myTime // Some time that you need
}
// "Redefine" timeAfter etc.
if !Obj{}.TimeCriticalFunc(10 * 24 * time.Hour) {
t.Fail()
}
}