Main Content

모의 객체 상호 작용 가설 검정하기

모의 객체를 생성할 때, 모의 객체 동작을 제어하는 연결된 동작 객체도 생성합니다. 이 객체를 사용하여, 테스트 중인 컴포넌트에서 모의 객체로 전송될 때 가로챈 메시지에 액세스할 수 있습니다(소위 감시(Spying)로 불리는 과정임). 모의 객체 생성에 대한 자세한 내용은 모의 객체 생성하기 항목을 참조하십시오.

모의 프레임워크에서 가설 검정(Qualification)은 객체와의 상호 작용을 테스트하는 데 사용되는 기능입니다. 가설 검정에는 네 가지 유형이 있습니다.

  • 검증(Verification) — 예외를 발생시키지 않으면서 실패를 생성하고 기록합니다. 검증은 예외를 발생시키지 않으므로, 검증 실패가 발생하는 경우에도 모든 테스트 콘텐츠가 완료될 때까지 실행됩니다. 일반적으로 테스트를 조기에 종료할 필요가 없기 때문에 검증(Verification)은 단위 테스트에서 우선적으로 사용되는 가설 검정 유형입니다. 사전 조건 위반 또는 잘못된 테스트 설정을 테스트하려면 다른 가설 검정 유형을 사용하십시오.

  • 가정(Assumption) — 해당 테스트 환경이 사전 조건에 부합하는지 확인합니다. 그러나 사전 조건에 부합하지 않더라도 이로 인해 테스트가 실패하는 것은 아닙니다. 가정이 실패하면 필터링된 테스트가 생성되고, 테스트 프레임워크가 해당 테스트를 미완료 상태로 표시합니다.

  • 어설션 — 실패 조건이 현재 테스트 콘텐츠의 나머지를 무효화하도록 합니다. 그러나 후속 테스트 메서드의 올바른 실행을 차단하지는 않습니다. 어설션 지점에서 실패할 경우 현재 테스트 메서드가 실패, 미완료 상태로 표시됩니다.

  • 치명적 어설션(Fatal Assertion) — 실패 시 테스트 세션을 중단합니다. 이러한 가설 검정은 실패 모드가 매우 주요한 사안이라 테스트를 계속할 이유가 없는 경우에 유용합니다. 또한, 픽스처(Fixture) 해제를 수행해도 MATLAB® 상태가 올바르게 복원되지 않으며 테스트를 중단하고 새 세션을 시작하는 것이 더 나은 경우에도 유용합니다.

모의 객체는 슈퍼클래스로 지정된 인터페이스의 추상 메서드와 속성을 구현한 것입니다. 슈퍼클래스 없이 모의 객체를 생성할 수도 있는데, 이 경우 모의 객체에 묵시적 인터페이스가 있습니다. dice 클래스에 대한 묵시적 인터페이스가 있는 모의 객체를 만듭니다. 인터페이스에는 Color 속성과 NumSides 속성, 여러 dice를 받고 값을 반환하는 roll 메서드가 포함됩니다. 이 인터페이스는 현재 구현되어 있지 않지만 이 인터페이스가 있는 모의 객체를 생성할 수 있습니다.

testCase = matlab.mock.TestCase.forInteractiveUse;
[mock,behaviorObj] = testCase.createMock('AddedProperties', ...
    {'NumSides','Color'},'AddedMethods',{'roll'});

모의 메서드 상호 작용 가설 검정하기

모의 객체는 자신에게 전송되는 상호 작용을 기록하므로 모의 메서드가 호출되었다는 가설을 검정할 수 있습니다. 주사위를 한 개를 굴립니다.

val = mock.roll(1);

roll 메서드가 1개 주사위로 호출되었는지 검증합니다.

testCase.verifyCalled(behaviorObj.roll(1))
Interactive verification passed.

roll 메서드가 3개 주사위로 호출되었는지 검증합니다. 이 테스트 결과는 실패입니다.

testCase.verifyCalled(behaviorObj.roll(3), ...
    'roll method should have been called with input 3.')
Interactive verification failed.

----------------
Test Diagnostic:
----------------
roll method should have been called with input 3.

---------------------
Framework Diagnostic:
---------------------
verifyCalled failed.
--> Method 'roll' was not called with the specified signature.
--> Observed method call(s) with any signature:
        out = roll([1×1 matlab.mock.classes.Mock], 1)

Specified method call:
    MethodCallBehavior
        [...] = roll(<Mock>, 3)

roll 메서드가 2개 주사위로 호출되지 않았는지 검증합니다.

testCase.verifyNotCalled(behaviorObj.roll(2))
Interactive verification passed.

MethodCallBehavior 클래스의 withAnyInputs, withExactInputs, withNargout 메서드가 MethodCallBehavior 객체를 반환하므로 가설 검정에 사용할 수 있습니다. roll 메서드가 임의의 입력값으로 최소 한 번 이상 호출되었는지 검증합니다.

testCase.verifyCalled(withAnyInputs(behaviorObj.roll))
Interactive verification passed.

roll 메서드가 두 개의 출력값과 임의의 입력값으로 호출되지 않았는지 검증합니다.

testCase.verifyNotCalled(withNargout(2,withAnyInputs(behaviorObj.roll)))
Interactive verification passed.

모의 속성 상호 작용 가설 검정하기

메서드 호출과 마찬가지로, 모의 객체는 속성 설정과 액세스 작업을 기록합니다. 주사위의 색을 설정합니다.

mock.Color = "red"
mock = 

  Mock with properties:

    NumSides: []
       Color: "red"

색이 설정되었는지 검증합니다.

testCase.verifySet(behaviorObj.Color)
Interactive verification passed.

색이 액세스되었는지 검증합니다. MATLAB이 객체를 표시할 때 묵시적 속성 액세스가 있으므로 이 테스트 결과는 통과입니다.

testCase.verifyAccessed(behaviorObj.Color)
Interactive verification passed.

면 개수가 설정되지 않았음을 어설션합니다.

testCase.assertNotSet(behaviorObj.NumSides)
Interactive assertion passed.

모의 객체 제약 조건 사용하기

matlab.mock.TestCase 메서드를 사용하면 모의 상호 작용에 대해 간편하게 감시(Spying)를 수행할 수 있습니다. 그러나 matlab.mock.constraints 네임스페이스에 있는 클래스를 사용할 경우 더 많은 기능이 제공됩니다. 제약 조건을 사용하려면 동작 객체와 제약 조건을 verifyThat, assumeThat, assertThat 또는 fatalAssertThat 메서드로 전달하십시오.

새 모의 객체를 만듭니다.

testCase = matlab.mock.TestCase.forInteractiveUse;
[mock,behaviorObj] = testCase.createMock('AddedProperties', ...
    {'NumSides','Color'},'AddedMethods',{'roll'});

주사위 두 개를 굴립니다. 그런 다음, 제약 조건을 사용하여 roll 메서드가 2개 주사위로 최소 한 번 이상 호출되었는지 검증합니다.

val = mock.roll(2);

import matlab.mock.constraints.WasCalled
testCase.verifyThat(behaviorObj.roll(2),WasCalled)
Interactive verification passed.

주사위를 한 개를 굴립니다. 그런 다음, roll 메서드가 임의의 입력값으로 최소 두 번 이상 호출되었는지 검증합니다.

val = mock.roll(1);

testCase.verifyThat(withAnyInputs(behaviorObj.roll), ...
    WasCalled('WithCount',2))
Interactive verification passed.

NumSides가 액세스되지 않았는지 검증합니다.

import matlab.mock.constraints.WasAccessed
testCase.verifyThat(behaviorObj.NumSides,~WasAccessed)
Interactive verification passed.

주사위의 색을 설정합니다. 그런 다음, 속성을 한 번 설정했는지 검증합니다.

mock.Color = "blue";

import matlab.mock.constraints.WasSet
testCase.verifyThat(behaviorObj.Color,WasSet('WithCount',1))
Interactive verification passed.

Color 속성에 액세스합니다. 그런 다음, 이 속성이 정확히 한 번 액세스되지 않았는지 검증합니다. 이 테스트 결과는 실패입니다.

c = mock.Color

testCase.verifyThat(behaviorObj.Color,~WasAccessed('WithCount',1))
c = 

    "blue"

Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
Negated WasAccessed failed.
--> Property 'Color' was accessed the prohibited number of times.
    
    Actual property access count:
             1
    Prohibited property access count:
             1

Specified property access:
    PropertyGetBehavior
        <Mock>.Color

면 개수를 설정합니다. 그런 다음, 면 개수가 22로 설정되었는지 검증합니다.

mock.NumSides = 22;
testCase.verifyThat(behaviorObj.NumSides,WasSet('ToValue',22))
Interactive verification passed.

matlab.unittest.constraints 네임스페이스에서 제약 조건을 사용하여 주사위의 면 개수가 20보다 큰 수로 설정되지 않았음을 어설션합니다. 이 테스트 결과는 실패입니다.

import matlab.unittest.constraints.IsLessThanOrEqualTo
testCase.verifyThat(behaviorObj.NumSides, ...
    WasSet('ToValue',IsLessThanOrEqualTo(20)))
Interactive verification failed.

---------------------
Framework Diagnostic:
---------------------
WasSet failed.
--> Property 'NumSides' was not set to the specified value.
--> Observed property set(s) to any value:
        <Mock>.NumSides = 22

Specified property set:
    PropertySetBehavior
        <Mock>.NumSides = <IsLessThanOrEqualTo constraint>

가설 검정 요약

가설 검정의 유형TestCase 메서드matlab.mock.constraints 클래스
matlab.unittest.TestCase 메서드 사용matlab.mock.constraints 클래스 포함
메서드가 호출되었음verifyCalled 또는 verifyNotCalledverifyThatWasCalled 또는 Occurred
assumeCalled 또는 assumeNotCalledassumeThat
assertCalled 또는 assertNotCalledassertThat
fatalAssertCalled 또는 fatalAssertNotCalledfatalAssertThat
메서드가 특정 횟수만큼 호출되었음해당 없음verifyThat, assumeThat, assertThat 또는 fatalAssertThatWasCalled
속성에 액세스했음verifyAccessed 또는 verifyNotAccessedverifyThatWasAccessed 또는 Occurred
assumeAccessed 또는 assumeNotAccessedassumeThat
assertAccessed 또는 assertNotAccessedassertThat
fatalAssertAccessed 또는 fatalAssertNotAccessedfatalAssertThat
속성에 특정 횟수만큼 액세스했음해당 없음verifyThat, assumeThat, assertThat 또는 fatalAssertThatWasAccessed
속성이 설정되었음verifySet 또는 verifyNotSetverifyThatWasSet 또는 Occurred
assumeSet 또는 assumeNotSetassumeThat
assertSet 또는 assertNotSetassertThat
fatalAssertSet 또는 fatalAssertNotSetfatalAssertThat
속성이 특정 횟수만큼 설정되었음해당 없음verifyThat, assumeThat, assertThat 또는 fatalAssertThatWasSet
속성이 특정 값으로 설정되었음해당 없음verifyThat, assumeThat, assertThat 또는 fatalAssertThatWasSet 또는 Occurred
메서드가 호출되었고 속성이 특정 순서로 액세스되거나 설정되었음해당 없음verifyThat, assumeThat, assertThat 또는 fatalAssertThatOccurred

참고 항목

클래스

관련 항목