目录

如何用 PHPUnit 测试类的私有方法

当要对类中的私有方法进行测试时,很难通过创建对象的实例,然后调用这个方法进行单元测试。但是有其他两种方法对私有方法进行测试。

方法一

使用反射的方式来读取代码文件,再对要测试的方法的可见性进行改变,以使得可以在外部调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
public function testCleanMetrics()
{
    $metrics = [
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    ];

    $method = new \ReflectionMethod('\Cronitor\Monitor', 'cleanMetrics'); // 反射获取类的方法
    $method->setAccessible(true); // 修改方法的可访问性

    $cleanMetricsResult = $method->invokeArgs($this->monitor, [$metrics]);

    $this->assertSame('key1:value1', $cleanMetricsResult[0]);
    $this->assertArrayNotHasKey('key1', $cleanMetricsResult);
}

方法二

通过写一个匿名函数,并对函数进行重新绑定,以使得可以在外部调用。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
public function testCleanMetrics()
{
    $metrics = [
        'key1' => 'value1',
        'key2' => 'value2',
        'key3' => 'value3'
    ];

    $monitor = new \Cronitor\Monitor();

    $bar = function () use ($metrics) {
        return $this->cleanMetrics();
    };

    $baz = $bar->bindTo($monitor, $monitor);

    $this->assertSame('key1:value1', $baz()[0]);
    $this->assertArrayNotHasKey('key1', $$baz());
}