// Code generated by mockery v1.0.0. DO NOT EDIT.

package mocks

import mock "github.com/stretchr/testify/mock"

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

// UploadBytes provides a mock function with given fields: data, fileName, dst
func (_m *GoldUploader) UploadBytes(data []byte, fileName string, dst string) error {
	ret := _m.Called(data, fileName, dst)

	var r0 error
	if rf, ok := ret.Get(0).(func([]byte, string, string) error); ok {
		r0 = rf(data, fileName, dst)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}

// UploadJSON provides a mock function with given fields: data, tempFileName, gcsObjectPath
func (_m *GoldUploader) UploadJSON(data interface{}, tempFileName string, gcsObjectPath string) error {
	ret := _m.Called(data, tempFileName, gcsObjectPath)

	var r0 error
	if rf, ok := ret.Get(0).(func(interface{}, string, string) error); ok {
		r0 = rf(data, tempFileName, gcsObjectPath)
	} else {
		r0 = ret.Error(0)
	}

	return r0
}
