<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=PHPUnitManual%3A10.2</id>
	<title>PHPUnitManual:10.2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://trans.onionmixer.net/wiki/index.php?action=history&amp;feed=atom&amp;title=PHPUnitManual%3A10.2"/>
	<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=PHPUnitManual:10.2&amp;action=history"/>
	<updated>2026-05-02T04:37:57Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://trans.onionmixer.net/wiki/index.php?title=PHPUnitManual:10.2&amp;diff=3412&amp;oldid=prev</id>
		<title>Onionmixer: PHPUnit 10.2 Mock 오브젝트 페이지 추가</title>
		<link rel="alternate" type="text/html" href="https://trans.onionmixer.net/wiki/index.php?title=PHPUnitManual:10.2&amp;diff=3412&amp;oldid=prev"/>
		<updated>2013-07-02T13:22:42Z</updated>

		<summary type="html">&lt;p&gt;PHPUnit 10.2 Mock 오브젝트 페이지 추가&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;;10.2 Mock 오브젝트&lt;br /&gt;
&lt;br /&gt;
실제 객체를 대신해서, 메소드가 호출되는 등의 기대되는 동작을 검증하는 테스트 더블을 mock 이라고 합니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
mock 오브젝트는 SUT 의 간접 출력 내용을 검증하기 위해 사용하는 관측 지점입니다. 일반적으로 mock 오브젝트에는 테스트용 stub 기능도 포함됩니다. 테스트에 실패하지 않은 경우, 간접 출력의 검증용 값을 SUT 에 반환하는 기능입니다. 따라서, mock 오브젝트는 테스트용 stub 에 단순히 검증 기능을 추가한 것이 아닙니다. 그 이외의 용도로도 사용할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
한가지 예를 들겠습니다. 여기서는 다른 오브젝트를 관찰하는 한 오브젝트의 특정 메소드 (update() 가 적절하게 호출되었는지를 조사하고자 합니다. 예10.10 &amp;quot;테스트 대상 시스템 (SUT) 에 포함된 Subject 클래스와 Observer 클래스&amp;quot; 는 테스트 대상 시스템 (SUT) 에 포함된 Subject 클래스와 Observer 클래스의 코드입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.10 테스트 대상 시스템 (SUT) 에 포함된 Subject 클래스와 Observer 클래스&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class Subject&lt;br /&gt;
{&lt;br /&gt;
    protected $observers = array();&lt;br /&gt;
 &lt;br /&gt;
    public function attach(Observer $observer)&lt;br /&gt;
    {&lt;br /&gt;
        $this-&amp;gt;observers[] = $observer;&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function doSomething()&lt;br /&gt;
    {&lt;br /&gt;
        // Do something.&lt;br /&gt;
        // ...&lt;br /&gt;
 &lt;br /&gt;
        // Notify observers that we did something.&lt;br /&gt;
        $this-&amp;gt;notify(&amp;#039;something&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function doSomethingBad()&lt;br /&gt;
    {&lt;br /&gt;
        foreach ($this-&amp;gt;observers as $observer) {&lt;br /&gt;
            $observer-&amp;gt;reportError(42, &amp;#039;Something bad happened&amp;#039;, $this);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    protected function notify($argument)&lt;br /&gt;
    {&lt;br /&gt;
        foreach ($this-&amp;gt;observers as $observer) {&lt;br /&gt;
            $observer-&amp;gt;update($argument);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Other methods.&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
class Observer&lt;br /&gt;
{&lt;br /&gt;
    public function update($argument)&lt;br /&gt;
    {&lt;br /&gt;
        // Do something.&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public function reportError($errorCode, $errorMessage, Subject $subject)&lt;br /&gt;
    {&lt;br /&gt;
        // Do something&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    // Other methods.&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.11 &amp;quot;한 메소드가 지정된 인수로 한 번만 호출되는 것을 확인하는 테스트&amp;quot; 는 mock 오브젝트를 생성하여 Subject 오브젝트와 Observer 오브젝트의 상호 작용을 테스트하는 방법입니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
먼저, PHPUnit_Framework_TestCase 클래스의 getMock() 메소드를 사용하여 Observer 의 mock 오브젝트를 생성합니다. getMock() 메소드의 2번째 옵션 인수에 배열을 넘기고 있기 때문에, Observer 클래스의 update() 메소드만이 mock 으로 구현됩니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.11 한 메소드가 지정된 인수로 한 번만 호출되는 것을 확인하는 테스트&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class SubjectTest extends PHPUnit_Framework_TestCase&lt;br /&gt;
{&lt;br /&gt;
    public function testObserversAreUpdated()&lt;br /&gt;
    {&lt;br /&gt;
        // Create a mock for the Observer class,&lt;br /&gt;
        // only mock the update() method.&lt;br /&gt;
        $observer = $this-&amp;gt;getMock(&amp;#039;Observer&amp;#039;, array(&amp;#039;update&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
        // Set up the expectation for the update() method&lt;br /&gt;
        // to be called only once and with the string &amp;#039;something&amp;#039;&lt;br /&gt;
        // as its parameter.&lt;br /&gt;
        $observer-&amp;gt;expects($this-&amp;gt;once())&lt;br /&gt;
                 -&amp;gt;method(&amp;#039;update&amp;#039;)&lt;br /&gt;
                 -&amp;gt;with($this-&amp;gt;equalTo(&amp;#039;something&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
        // Create a Subject object and attach the mocked&lt;br /&gt;
        // Observer object to it.&lt;br /&gt;
        $subject = new Subject;&lt;br /&gt;
        $subject-&amp;gt;attach($observer);&lt;br /&gt;
 &lt;br /&gt;
        // Call the doSomething() method on the $subject object&lt;br /&gt;
        // which we expect to call the mocked Observer object&amp;#039;s&lt;br /&gt;
        // update() method with the string &amp;#039;something&amp;#039;.&lt;br /&gt;
        $subject-&amp;gt;doSomething();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
with() 메소드에는 임의의 수의 인수를 넘길 수 있습니다. 이는 mock 대상 메소드의 인수 수에 대응합니다. 메소드의 인수에 대해서 단순한 매칭이 아닌 보다 고도한 제약을 지정할 수도 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.12 인수를 가지는 메소드가 호출되는 것을 다양한 제약을 부여하여 테스트하는 예&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class SubjectTest extends PHPUnit_Framework_TestCase&lt;br /&gt;
{&lt;br /&gt;
    public function testErrorReported()&lt;br /&gt;
    {&lt;br /&gt;
        // Create a mock for the Observer class, mocking the&lt;br /&gt;
        // reportError() method&lt;br /&gt;
        $observer = $this-&amp;gt;getMock(&amp;#039;Observer&amp;#039;, array(&amp;#039;reportError&amp;#039;));&lt;br /&gt;
 &lt;br /&gt;
        $observer-&amp;gt;expects($this-&amp;gt;once())&lt;br /&gt;
                 -&amp;gt;method(&amp;#039;reportError&amp;#039;)&lt;br /&gt;
                 -&amp;gt;with($this-&amp;gt;greaterThan(0),&lt;br /&gt;
                        $this-&amp;gt;stringContains(&amp;#039;Something&amp;#039;),&lt;br /&gt;
                        $this-&amp;gt;anything());&lt;br /&gt;
 &lt;br /&gt;
        $subject = new Subject;&lt;br /&gt;
        $subject-&amp;gt;attach($observer);&lt;br /&gt;
 &lt;br /&gt;
        // The doSomethingBad() method should report an error to the observer&lt;br /&gt;
        // via the reportError() method&lt;br /&gt;
        $subject-&amp;gt;doSomethingBad();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
표4.3 &amp;quot;제약&amp;quot; 은 메소드의 인수에 적용 가능한 제약에 대해서, 표10.1 &amp;quot;Matchers&amp;quot; 는 기동 횟수를 지정하기 위해 사용 가능한 matcher 입니다.&lt;br /&gt;
&lt;br /&gt;
{| class = &amp;quot;collapsible collapsed&amp;quot; width=100% style = &amp;quot;border-radius: 10px; -moz-border-radius: 10px; -webkit-border-radius: 10px; -khtml-border-radius: 10px; -icab-border-radius: 10px; -o-border-radius: 10px; border: 5px groove #000066;&amp;quot;&lt;br /&gt;
|- style=&amp;quot;color: white; background-color: black;&amp;quot;&lt;br /&gt;
|&amp;#039;&amp;#039;&amp;#039;Matcher&amp;#039;&amp;#039;&amp;#039;||&amp;#039;&amp;#039;&amp;#039;의미&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount any()||평가 대상 메소드가 0회 이상 실행된 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_InvokedCount never()||평가 대상 메소드가 실행되지 않은 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce atLeastOnce()||평가 대상 메소드가 최소 1회 이상 실행된 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_InvokedCount once()||평가 대상 메소드가 단 한 번 실행된 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_InvokedCount exactly(int $count)||평가 대상 메소드가 $count 번 실행된 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;vertical-align:top;&amp;quot;&lt;br /&gt;
|PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex at(int $index)||평가 대상 메소드가 $index 번 째로 실행된 경우에 매치되는 오브젝트를 반환&lt;br /&gt;
|- style=&amp;quot;color: black; background-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |표10.1. Matchers&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
getMockForAbstractClass() 메소드는 추상 클래스의 mock 오브젝트를 반환합니다. 이 클래스의 모든 추상 메소드가 mock 대상입니다. 이를 사용하여 추상 클래스의 구상(concrete) 메소드를 테스트할 수 있습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.13: 추상 클래스의 구상 메소드의 테스트&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
abstract class AbstractClass&lt;br /&gt;
{&lt;br /&gt;
    public function concreteMethod()&lt;br /&gt;
    {&lt;br /&gt;
        return $this-&amp;gt;abstractMethod();&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    public abstract function abstractMethod();&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
class AbstractClassTest extends PHPUnit_Framework_TestCase&lt;br /&gt;
{&lt;br /&gt;
    public function testConcreteMethod()&lt;br /&gt;
    {&lt;br /&gt;
        $stub = $this-&amp;gt;getMockForAbstractClass(&amp;#039;AbstractClass&amp;#039;);&lt;br /&gt;
        $stub-&amp;gt;expects($this-&amp;gt;any())&lt;br /&gt;
             -&amp;gt;method(&amp;#039;abstractMethod&amp;#039;)&lt;br /&gt;
             -&amp;gt;will($this-&amp;gt;returnValue(TRUE));&lt;br /&gt;
 &lt;br /&gt;
        $this-&amp;gt;assertTrue($stub-&amp;gt;concreteMethod());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.14 한 메소드가 한 번 호출되고, 동일 오브젝트가 넘겨진 것을 조사하는 테스트&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class FooTest extends PHPUnit_Framework_TestCase&lt;br /&gt;
{&lt;br /&gt;
    public function testIdenticalObjectPassed()&lt;br /&gt;
    {&lt;br /&gt;
        $expectedObject = new stdClass;&lt;br /&gt;
 &lt;br /&gt;
        $mock = $this-&amp;gt;getMock(&amp;#039;stdClass&amp;#039;, array(&amp;#039;foo&amp;#039;));&lt;br /&gt;
        $mock-&amp;gt;expects($this-&amp;gt;once())&lt;br /&gt;
             -&amp;gt;method(&amp;#039;foo&amp;#039;)&lt;br /&gt;
             -&amp;gt;with($this-&amp;gt;identicalTo($expectedObject));&lt;br /&gt;
 &lt;br /&gt;
        $mock-&amp;gt;foo($expectedObject);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
예10.15: 인수의 clone 을 유효로 한 mock 오브젝트의 생성&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
class FooTest extends PHPUnit_Framework_TestCase&lt;br /&gt;
{&lt;br /&gt;
    public function testIdenticalObjectPassed()&lt;br /&gt;
    {&lt;br /&gt;
        $cloneArguments = true;&lt;br /&gt;
 &lt;br /&gt;
        $mock = $this-&amp;gt;getMock(&lt;br /&gt;
            &amp;#039;stdClass&amp;#039;,&lt;br /&gt;
            array(),&lt;br /&gt;
            array(),&lt;br /&gt;
            &amp;#039;&amp;#039;,&lt;br /&gt;
            FALSE,&lt;br /&gt;
            TRUE,&lt;br /&gt;
            TRUE,&lt;br /&gt;
            $cloneArguments&lt;br /&gt;
        );&lt;br /&gt;
 &lt;br /&gt;
        // or using the mock builder&lt;br /&gt;
        $mock = $this-&amp;gt;getMockBuilder(&amp;#039;stdClass&amp;#039;)-&amp;gt;enableArgumentCloning()-&amp;gt;getMock();&lt;br /&gt;
 &lt;br /&gt;
        // now your mock clones parameters so the identicalTo constraint will fail.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:PHPUnitManual]]&lt;/div&gt;</summary>
		<author><name>Onionmixer</name></author>
	</entry>
</feed>