2015-01-17 4 views
1

JMockit을 처음 사용하고 매우 복잡한 클래스의 테스트를 작성한 경우이를 XYZ라고합니다. 각 @Test 메서드에서, 나는 XYZ의 해당 실제 메서드를 호출하고 싶지만 나중에 (또는 때로는 거의 모든) 다른 메서드를 모의합니다.이 메서드는 나중에 확인해야합니다. "java.lang의 내가 테스트를 실행하면JMockit 부분 모의 - 하나를 제외한 모든 메소드

@Test 
public void testStart(@Mocked({ "^(start).*" }) XYZ xyz) { 
    new Expectations() {{ 
     xyz.isValidState(); result = true; 
    }}; 
    ... 
} 

, 내가 얻을 : 순간 내 첫 번째 테스트 방법은 (내가"시작 "을 제외한 모든 방법을 조롱하려는, 그래서 정규식을 사용하고 있습니다) 다음과 같습니다 .IllegalStateException :이 시점에서 조롱 된 유형에 대한 호출이 누락되었으므로 적절한 조롱 필드 또는 매개 변수 "(첫 번째 기대가 정의 된 행에서)가 선언 된 후에 만 ​​이러한 호출이 표시되는지 확인하십시오. 작업. 내 정규식이 잘못 되었나요? 아니면 또 다른 문제입니까?

답변

3

그 정규식은 될 조롱 방법을 선택합니다. 따라서 isValidState()이 아니며은 표현과 일치하지 않으므로 조롱을 당합니다. 따라서 JMockit은 "result"필드가 사용 된 시점에서 조롱받은 호출이 없다고 말합니다. 조롱해야하는 모든 방법에 기대를 new Expectations(XYZ.class)와 부분적인 조롱을 사용하여 다음 기록을 제외한 모든 다른 사람을 조롱하면서

는 클래스에 단지 하나의 방법 하지 모의 할 수있는 방법이 없습니다. 이것은 당연히 성가시다. 부분적 조롱은 일반적으로 사용되는 기능이 아니기 때문에 좋은 것은 여기 있습니다. 그것은 예외적 인 상황만을위한 것입니다.

클래스 테스트를 원할 경우, 심지어 복잡한 테스트 일지라도 조롱은 종속성으로 제한되어야하며 선택한 종속성 만 테스트 대상 유닛 외부로 간주해야합니다. 즉, XYZ의 주어진 내부적으로 호출 된 메소드가 깨끗한 테스트의 방법으로 들어 오면 예외적으로 부분적 조롱을 통해이를 조롱하도록 선택할 수 있습니다. 그러나 이것은 보통 XYZ단일 방법 (또는 단지 몇 가지)을 시험 당 모의한다는 것을 의미합니다.

+0

나는 "수업을 제외하고는 한 가지 방법을 모의 할 방법이 없다"고 말한 것 같아요. – unigeek

+0

실제로; 지금 고쳤다. –

+0

Rogerio, 나는 문서에서이 문제를 발견하게되었습니다. 여기에 관련이 있습니까? inverse 속성은 기본적으로 false와 같으며 지정된 모의 필터의 의미를 반전시킵니다. 예를 들어, @Mocked ("nanoTime") 또는 @Mocked (methods = "nanoTime", inverse = false)는 System # nanoTime() 메소드가 조롱 될 경우, @Mocked (methods = "nanoTime", inverse = true) 역 지정은 java.lang.System 클래스에서 조롱되지 않는 유일한 메소드가되도록합니다. " – unigeek

관련 문제