自动注入依赖项以进行单元测试

3

作为一名有Java背景的开发者,我正在处理php代码库,并且想为我的代码添加单元测试。

我有一个服务类,其包含以下DAO类:

class ServiceClass {

  private $daoClass;

  public function methodToTest(){}
}

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

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

在Java中,我们可以很容易地使用@InjectMocks注释或MockitoAnnotations.initMocks方法来完成这项工作。

我无法找到在phpunit中执行类似操作的方式。

另外,一个不同但相关的问题是,在我的测试中是否有任何方法可以创建一个私有属性并用某些标记注释它,然后自动将其转换为模拟对象实例?就像Java中的mockito一样,它使用@Mock注释。


1
你有检查过这个吗?https://github.com/eltrino/PHPUnit_MockAnnotations - Simonluca Landi
1
我猜PHP-DI的在现有实例上注入功能被使用了。你会考虑使用它来组装正在测试的对象吗?基本上,你手动做的是它所做的相同的事情。 - xmike
1个回答

0

我不知道有没有类似于注解模拟的东西(可以看第一条评论中的链接),但是为了测试目的,您可以在纯PHP中为这些服务类创建自己的模拟。这相当简单,只需要为开发正确配置自动加载即可。这样做的好处是,您的库随附适当的模拟,否则您将在生产代码中混合使用仅用于测试的注释,这些注释会扩散到非测试上下文中。

如果您来自Java,这可能不完全符合您的要求,但是我在PHP中使用这种“手写”的测试助手时取得了良好的经验,特别是当涉及某些类族时。最终它们非常有用,并且可以节省大量重复的测试。有时,它们甚至是必需的,因为动态创建的模拟无法表达和断言测试所需的内容。


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