class Minitest::Mock

def expect name, retval, args = [], **kwargs, &blk

def expect name, retval, args = [], **kwargs, &blk
  name = name.to_sym
  if blk then
    raise ArgumentError, "args ignored when block given" unless args.empty?
    raise ArgumentError, "kwargs ignored when block given" unless kwargs.empty?
    @expected_calls[name] << { :retval => retval, :block => blk }
  else
    raise ArgumentError, "args must be an array" unless Array === args
    if ENV["MT_KWARGS_HAC\K"] && (Hash === args.last ||
                                  Hash ==  args.last) then
      if kwargs.empty? then
        kwargs = args.pop
      else
        unless @@KW_WARNED then
          from = caller(1..1).first
          warn "Using MT_KWARGS_HAC\K yet passing kwargs. From #{from}"
          @@KW_WARNED = true
        end
      end
    end
    @expected_calls[name] <<
      { :retval => retval, :args => args, :kwargs => kwargs }
  end
  self
end