// Code generated by mockery v0.0.0-dev. DO NOT EDIT.

package mocks

import (
	mock "github.com/stretchr/testify/mock"
	watch "k8s.io/apimachinery/pkg/watch"
)

// Interface is an autogenerated mock type for the Interface type
type Interface struct {
	mock.Mock
}

// ResultChan provides a mock function with no fields
func (_m *Interface) ResultChan() <-chan watch.Event {
	ret := _m.Called()

	if len(ret) == 0 {
		panic("no return value specified for ResultChan")
	}

	var r0 <-chan watch.Event
	if rf, ok := ret.Get(0).(func() <-chan watch.Event); ok {
		r0 = rf()
	} else {
		if ret.Get(0) != nil {
			r0 = ret.Get(0).(<-chan watch.Event)
		}
	}

	return r0
}

// Stop provides a mock function with no fields
func (_m *Interface) Stop() {
	_m.Called()
}

// NewInterface creates a new instance of Interface. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
// The first argument is typically a *testing.T value.
func NewInterface(t interface {
	mock.TestingT
	Cleanup(func())
}) *Interface {
	mock := &Interface{}
	mock.Mock.Test(t)

	t.Cleanup(func() { mock.AssertExpectations(t) })

	return mock
}
