当要对类中的私有方法进行测试时,很难通过创建对象的实例,然后调用这个方法进行单元测试。但是有其他两种方法对私有方法进行测试。
方法一
使用反射的方式来读取代码文件,再对要测试的方法的可见性进行改变,以使得可以在外部调用。
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());
}
|