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

package mocks

import (
	testing "testing"

	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 given fields:
func (_m *Interface) ResultChan() <-chan watch.Event {
	ret := _m.Called()

	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 given fields:
func (_m *Interface) Stop() {
	_m.Called()
}

// NewInterface creates a new instance of Interface. It also registers a cleanup function to assert the mocks expectations.
func NewInterface(t testing.TB) *Interface {
	mock := &Interface{}

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

	return mock
}
