返回

PHPUnit MockObject 如何根据参数返回不同值?

php

## 利用 PHPUnit MockObject 根据参数返回不同值

什么是 PHPUnit MockObject?

PHPUnit MockObject 是一个用于在单元测试中创建 mock 对象的框架。Mock 对象允许您创建模拟其他对象的类或接口,并指定它们的返回行为。这对于测试无法直接访问或难以设置的代码部分非常有用。

根据参数返回不同值

默认情况下,PHPUnit MockObject 始终返回相同的预定义值,无论其参数是什么。然而,我们可以使用 returnCallback 函数根据传递给 mock 方法的参数返回不同的值。

代码示例:

$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any())
     ->method('methodToMock')
     ->will($this->returnCallback(function ($argument) {
         switch ($argument) {
             case 'one':
                 return 'method called with argument "one"';
             case 'two':
                 return 'method called with argument "two"';
             default:
                 return 'default return value';
         }
     }));

实现步骤

  1. 创建一个 mock 对象并指定要 mock 的类或接口。
  2. 使用 expects() 方法指定对 mock 方法的预期调用。
  3. 使用 method() 方法指定要 mock 的方法。
  4. 使用 will() 方法指定返回行为,并传递一个 returnCallback 函数。
  5. 在回调函数中,使用 switch-case 语句根据参数返回不同的值。

常见问题解答

1. 是否可以返回复杂的数据结构?
是的,您可以使用 returnCallback 函数返回任何类型的数据结构,包括对象、数组和自定义类。

2. 如何 mock 具有多个参数的方法?
对于具有多个参数的方法,您需要使用 with() 方法指定每个参数的预期值。

3. 如何处理未识别的参数?
returnCallback 函数中,您可以提供一个默认情况,以处理未识别的参数。

4. 是否可以创建部分 mock?
是的,您可以使用 PartialMock 类创建部分 mock,其中仅 mock 选定的方法,而其他方法则可以正常执行。

5. 是否可以在 mock 对象上设置属性?
是的,您可以使用 ->method->will() 方法设置 mock 对象上的属性。

结论

通过使用 returnCallback 函数,您可以让 PHPUnit MockObject 根据其参数返回不同的值。这使您能够创建更全面和灵活的单元测试,并更彻底地测试您的代码。