java - 为单元测试自动注入(inject)依赖

标签 java php unit-testing mocking phpunit

来自 Java 背景,我正在研究 php 代码库,并想为我的代码添加单元测试。

我有一个服务类,它有一个 DAO 类,如下所示:

class ServiceClass {

  private $daoClass;

  public function methodToTest(){}
}

我没有提供构造函数,也没有为 daoClass 属性添加 setter 方法。这是因为它将使用 PHP-DI IoC 容器注入(inject)。

对于单元测试,我正在使用 phpunit,所以我正在模拟 daoClass 对象并使用反射直接注入(inject)该属性(因为没有构造函数或 setter 该属性)。

在 java 中,我们可以使用 @InjectMocks 注释或 MockitoAnnotations.initMocks 方法在没有反射的情况下轻松做到这一点。

我无法在 phpunit 中找到类似的方法。

此外,还有一个不同但相关的问题,在我的测试中有没有什么方法可以创建一个私有(private)属性并用一些标记对其进行注释,然后它会自动转换为模拟对象实例?就像Java中的mockito是如何做的@Mock注解。

最佳答案

我不知道自己有任何模拟注释(请参阅第一条评论以获取此类链接),但出于测试目的,您可以使用普通 PHP 为此类服务类创建自己的模拟测试。这非常简单,只需要为开发正确配置自动加载。这样做的好处是你的库附带了合适的模拟,否则你会把这些模拟混入生产代码中,并带有仅为测试而设计但传播到非测试上下文中的注释。

当您来自 Java 时,这可能不是您正在寻找的东西,但我在使用此类“手写”测试助手的 PHP 方面取得了很好的经验,尤其是在涉及某些类系列时。最后,它们非常有用,可以确保在测试中进行大量重复。有时它们甚至是必要的,因为动态创建的模拟无法表达和断言测试中可能需要的内容。

关于java - 为单元测试自动注入(inject)依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45495208/

相关文章:

java - 如何在 Java 中将控制台数据转换为文本文件

java - 在静态查询中设置变量

php - Inherited() 标志 : propertyName vs. storageName

c# - 在 C# 中生成 JavaScript 和后续测试

java - 使用整数数组进行冒泡排序

php - 如何从sql查询创建唯一的数据库名称

php - 排序多维数组中的文件列表

asp.net-mvc - 真的有必要测试 Controller 方法吗?

unit-testing - 从 Controller 单元测试中删除域类依赖项

java - 如何找到我的 Web 服务的 URL?