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

package mocks

import (
	context "context"

	mock "github.com/stretchr/testify/mock"
	continuous_integration "go.skia.org/infra/golden/go/continuous_integration"

	testing "testing"
)

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

// GetTryJob provides a mock function with given fields: ctx, id
func (_m *Client) GetTryJob(ctx context.Context, id string) (continuous_integration.TryJob, error) {
	ret := _m.Called(ctx, id)

	var r0 continuous_integration.TryJob
	if rf, ok := ret.Get(0).(func(context.Context, string) continuous_integration.TryJob); ok {
		r0 = rf(ctx, id)
	} else {
		r0 = ret.Get(0).(continuous_integration.TryJob)
	}

	var r1 error
	if rf, ok := ret.Get(1).(func(context.Context, string) error); ok {
		r1 = rf(ctx, id)
	} else {
		r1 = ret.Error(1)
	}

	return r0, r1
}

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

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

	return mock
}
