Coder Social home page Coder Social logo

Comments (6)

TedSander avatar TedSander commented on July 20, 2024

Sorry but we specifically changed this because of Strong mode. When you return a Type that is not the value you are specifying at the return type you are specifically breaking the type contract. Null is fine because null is all types.

from mockito.

srawlins avatar srawlins commented on July 20, 2024

@TedSander I think you're mixing up the issue. It's about noSuchMethod returning null, not any returning null.

from mockito.

srawlins avatar srawlins commented on July 20, 2024

@lestathc Doesn't this work? when(mockObj.foo).thenReturn(() { /* your stub */});

import 'package:test/test.dart';
import 'package:mockito/mockito.dart';

class HasFoo {
  void foo() {
    print('hey');
  }
}

class MockHasFoo extends Mock implements HasFoo {}

willCallCallback(void callback()) {
  callback();
}

void main() {
  var mhf = new MockHasFoo();
  test('hey', () {
    var called = false;
    when(mhf.foo).thenReturn(() {
      called = true;
    });
    willCallCallback(mhf.foo);
    expect(called, isTrue);
  });
}

from mockito.

TedSander avatar TedSander commented on July 20, 2024

Sorry my mistake

from mockito.

lestathc avatar lestathc commented on July 20, 2024

@srawlins

Yes, that works, but it is similar like my last test in my full example. Ideally, I want to write it simply like:

  var mhf = new MockHasFoo();
  test('hey', () {
    willCallCallback(mhf.foo);
    verify(mhf.foo());
  });

I have written a simple piece of code which may achieve it. But I am not sure whether it breaks strong mode (I even don't know whether strong mode works in dartpad).

@MirrorsUsed(symbols: 'foo, call')
import 'dart:mirrors';

class HasFoo {
  void foo() {}
}

var _verificationInProgress = false;

get verify => _makeVerify();

_makeVerify() {
  _verificationInProgress = true;
  return (FunctionGetterStub stub) {
     _verificationInProgress = false;
     stub.verify();
  };
}

class FunctionGetterStub {
  bool _verified = false;
  bool _invoked = false;
  invoke(Invocation inv) {
    _invoked = true;
    return '123';
  }
  verify() {
    if (_verified) throw 'vefiied';
    if (!_invoked) throw 'not invoked';
    _verified = true;
  }
  
  noSuchMethod(Invocation inv) => invoke(inv);
}

class MockHasFoo implements HasFoo {
  Map<Symbol, FunctionGetterStub> _funcToStub = {};
  
  FunctionGetterStub _createOrGetStub(Symbol symbol) {
    var stub = _funcToStub[symbol];
    if (stub == null) {
      stub = new FunctionGetterStub();
      _funcToStub[symbol] = stub;
    }
    return stub;
  }
  
  noSuchMethod(Invocation inv) {
    var stub = _createOrGetStub(inv.memberName);
    if (inv.isGetter /* and is getter for func */ || _verificationInProgress) {
      return stub;
    } else {
      return stub.invoke(inv);
    }
  }
}

void test1() {
  print('==== test 1 ====');
  var mock = new MockHasFoo();
  print('Getter: ${mock.foo}');
  print('Function: ${mock.foo()}');
  verify(mock.foo());
  print('pass!');
}

void test2() {
  print('==== test 2 ====');
  
  willCallCallback(void callback()) {
    callback();
  }
  
  var mock = new MockHasFoo();
  willCallCallback(mock.foo);
  verify(mock.foo());
  print('pass!');
}

void main() {
  test1();
  test2();
}

But the first thing is to decide whether we need to do it.

Thanks

from mockito.

srawlins avatar srawlins commented on July 20, 2024

Unfortunately, In Dart 2 tear offs with noSuchMethod don't play well to allow this. See #107 for more info.

from mockito.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.