繁体   English   中英

如何使用私有构造函数测试类

[英]How to test classes with private constructors

TLDR 版本

我应该如何使用在工厂类中创建的私有构造函数来测试对象?

完整版:

我正在尝试学习测试驱动的开发,并且必须在创建时验证我的密码值对象。 我还想使用 UI 的演示者/控制器代码中的验证来验证密码 TextFields。 这些是我正在使用的类。

密码类

import '../services/password_specification.dart';
import '../../../domain_base/value_object.dart';

part 'password_factory.dart';

class Password extends ValueObject<Password>{
  const Password._(this.value);

  @override
  int getHashCode() {
    return value.hashCode;
  }

  @override
  bool sameAs(Password other) {
    return value == other.value;
  }


  
  final String value;
}

密码工厂类

part of 'password.dart';

class PasswordFactory {
  const PasswordFactory(this._specification);
  
  Password create(String value) {
    if(!_specification.isValid(value))
      throw Error();

    return new Password._(value);
  }  

  final PasswordSpecification _specification;
}

密码规范类

class PasswordSpecification {
  const PasswordSpecification();

  bool isValid(String password) {
    if(password.length < 6)
      return false;

    return true;
  }
}

由于密码规范在一个单独的类中,我必须将其作为依赖项添加到我的 Password 类中。 但是我不想将密码规范的实例注入到我的密码值对象类中。

因此,我创建了一个 PasswordFactory 类来构造我的 Password 类。 工厂类获取一个 PasswordSpecification 对象注入它,然后在 create 函数中它使用它来验证密码,然后如果密码与规范匹配则返回密码,否则它会引发错误。 这确保了密码对象在验证失败时无法创建。

我还将我的 Password 类的构造函数设为库私有,以便无法使用该构造函数创建无效的 Password 对象。 由于这个变化,我的工厂也有一部分 Password 类的库来使用 Password 类的私有构造函数。 (我对使用部分和部分也有第二个想法,所以这里的任何建议也很好)。

现在当我尝试测试 Password 类时问题就来了。 如果其构造函数是私有的,我将如何测试密码类:)。 如果我应该模拟 PasswordFactory 类返回一个 Password 对象,我该怎么做?

任何关于做什么的建议将不胜感激!

我应该如何使用在工厂类中创建的私有构造函数来测试对象?

通过工厂进行测试。 毕竟,这就是 Password 类的客户端将如何使用它。

请记住:单元测试不是目标 它们是为实现目标而频繁出现的模式。 目标是代码没有错误; 如果您可以使用不同的测试技术更好地实现该目标,那么您应该这样做。


请注意,如果您真的想“单元测试”Password.class,您可以这样做。 您将准备一个所有其他组件都已知良好的类路径(Java 本地库、您信任的第三方代码、您自己的已通过测试的代码),然后将您的 Password.class 主题复制到该工具中,并运行您的测试。

因此,您的单元测试包含许多固定依赖项这一事实并不重要:您正在测量的是您为 Password 准备的类文件。

当然,这样做的成本/收益比是垃圾,除非您的系统已经设计为允许您独立于其他一切部署 Password.class。

当开发人员运行测试时,测试单元为“部署规模”(包/jar/工作树)的情况更为常见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM