来自 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/