문제

단위 테스트(TestNG 포함)에 jmockit을 사용하고 있는데, 일치자를 사용하여 기본 유형(부울)을 매개변수로 사용하는 메서드를 모의하기 위해 Expectations 클래스를 사용하는 데 문제가 있습니다.다음은 문제를 설명하는 몇 가지 샘플 코드입니다.

/******************************************************/
import static org.hamcrest.Matchers.is;

import mockit.Expectations;

import org.testng.annotations.Test;

public class PrimitiveMatcherTest {
  private MyClass obj;

  @Test
  public void testPrimitiveMatcher() {
    new Expectations(true) {
      MyClass c;
      {
        obj = c;
        invokeReturning(c.getFoo(with(is(false))), "bas");
      }
    };

    assert "bas".equals(obj.getFoo(false));

    Expectations.assertSatisfied();
  }

  public static class MyClass {
    public String getFoo(boolean arg) {
      if (arg) {
        return "foo";
      } else {
        return "bar";
      }
    }
  }
}
/******************************************************/

InvokeReturning(...) 호출이 포함된 줄은 NullPointerException을 발생시킵니다.

다음과 같이 매처를 사용하지 않도록 이 호출을 변경하면:

invokeReturning(c.getFoo(false), "bas");

그것은 잘 작동합니다.이것은 나에게 좋지 않습니다. 실제 코드에서는 실제로 다중 매개변수 메서드를 조롱하고 있고 다른 인수에 대해 일치자를 사용해야 하기 때문입니다.이 경우 Expectations 클래스에는 다음이 필요합니다. 모두 인수는 일치자를 사용합니다.

나는 이것이 버그라고 확신합니다. 아니면 기본 유형으로 Matcher를 사용하는 것이 불가능할 수도 있습니다(이것은 나를 슬프게 합니다).이 문제가 발생하여 해결 방법을 아는 사람이 있습니까?

도움이 되었습니까?

해결책 2

따라서 문제는 Expectations.with()에 있는 것 같습니다.

   protected final <T> T with(Matcher<T> argumentMatcher)
   {
      argMatchers.add(argumentMatcher);

      TypeVariable<?> typeVariable = argumentMatcher.getClass().getTypeParameters()[0];

      return (T) Utilities.defaultValueForType(typeVariable.getClass());
   }

typeVariable.getClass()에 대한 호출은 작성자가 기대한 대로 수행되지 않으며 Utilities.defaultValueFor 유형에 대한 호출은 null을 반환합니다.기본 부울 값을 다시 자동 박싱 해제하는 것이 NPE의 출처입니다.

InvokeReturning(...) 호출을 다음으로 변경하여 문제를 해결했습니다.

invokeReturning(withEqual(false)), "bas");

여기서는 더 이상 matcher를 사용하지 않지만 필요한 것에는 충분합니다.

다른 팁

문제는 Expectation 사용법과 Matchers가 기본 유형을 지원하지 않는다는 조합입니다.

Matchers 코드는 기본적으로 기본 유형을 지원하지 않는 Generic에 의존합니다.일반적으로 Matchers의 사용은 값 일치에 더 많이 사용됩니다.Java 5의 자동 박싱/언박싱 기능을 사용하면 일반적으로 문제가 되지 않습니다.

그러나 JMockit의 Expectation은 값 일치를 위해 이를 사용하지 않고 일종의 구문 분석에 사용하여 메소드 호출 서명 유형을 결정합니다. 이 경우 Matchers는 메소드가 기본 유형인 동안 부울 유형을 생성합니다. 그래서 실패합니다. 제대로 조롱하려면.

이에 대한 해결방안을 말씀드릴 수 없는 점 죄송합니다.어쩌면 다른 사람이 도움을 줄 수도 있습니다.

"with(is(false))" 및 기타 유사한 변형이 이제 예상대로 작동하도록 JMockit(릴리스 0.982)을 변경했습니다(더 이상 null을 반환하지 않고 내부 일치자 내의 실제 인수 값을 반환합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top