无法在Flutter中模拟单例类

10

我创建了一个单例类,使用静态方法获取该类的实例,但在单元测试时无法对该类进行模拟。 在Dart中是否有其他方式可以仅创建一个实例并且可以轻松地进行单元测试。

1个回答

11
根据您的具体要求,有不同的方法。
您可以使用一个额外的类来访问单例,在创建多个实例的同时,仍然可以保证访问的值是单例的:
class MySingleton {
  static final MySingleton value = MySingleton.();
  
  MySingleton._();
}

class MySingletonHelper {
  MySingleton get value => MySingleton.value;
}

或者使用@visibleForTesting的另一种方式,但是单例值不能是final,写入访问仅受DartAnalyzer限制,而不受编译器限制(我不认为这是一个严重的限制)。
import 'package:meta/meta.dart';

class MySingleton {
  static MySingleton _value = MySingleton.();

  static MySingleton get value => _value;

  @visibleForTesting
  static set value(MySingleton val) => _value = val; 
  
  MySingleton._();
}

你能展示一下使用工厂构造函数的方法吗?这是可能的吗? - Gagan Garcha
在Dart中使用工厂关键字,并使构造函数返回其实例。 - Gagan Garcha
https://dev59.com/I18e5IYBdhLWcg3wcJ8q 这个问题展示了一个工厂构造函数(类似于 https://www.dartlang.org/guides/language/language-tour#factory-constructors),同时也可以参考这个链接 https://dev59.com/qGcs5IYBdhLWcg3wrmDC#12649574。 - Günter Zöchbauer
@GünterZöchbauer,您认为使用工厂构造函数而不是命名构造函数更好吗?并且,是否最好使用此工厂构造函数而不是示例中使用的getter? - selan
@selan 是的,你可以使用工厂构造函数,但这样就会隐藏它是单例的事实,这可能会让调用者感到惊讶。我更喜欢让非标准的东西更加明显。如果你喜欢不透明的风格,那就继续吧。除了提到的偏好之外,我不知道还有什么其他优缺点。 - Günter Zöchbauer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接