2017-10-23 4 views
0

아래 링크 된 GitHub Repo에서 보았던 몇 가지 예제를 최근에 읽었고 기본 스프링 부트 오류 객체를 확장하는 데 사용했습니다. 나는 ApiError.java 클래스에 대한 몇 가지 테스트를 작성하려고 시도하고, 특히 #addValidationErrors에More Mockito RETURNS_DEEP_STUBS 비애

https://github.com/brunocleite/spring-boot-exception-handling/blob/master/src/main/java/com/example/springbootexceptionhandling/ApiError.java

기본 문제는 내가 일을 값을 반환하는 방법의 체인을 얻을 수있는 방법을 발견하지 않아도된다는 것입니다 . 이 시점에서 내 테스트는 테스트가 Mockito.when 메소드를 호출 라인에 NullPointerException와 사망이 시점에서 ...

@Test 
public void addValidationErrors() { 
    ApiError apiError = new ApiError(HttpStatus.OK); 
    ConstraintViolation mockViolation = Mockito.mock(ConstraintViolation.class, Mockito.RETURNS_DEEP_STUBS); 
    Mockito.when(mockViolation.getRootBeanClass().getSimpleName()).thenReturn("MyBeanName"); 
... 

를 다음과 같이 보입니다. 나는 @PrepareForTest과 같은 다양한 주석 조합과 함께 @Mock 아래 테스트 외부의 mockViolation을 선언하면서 다른 러너 클래스 (Mockito, JUnit4 및 심지어 PowerMock)를 시도했다.

답변

1

귀하의 구문은 정확하지만 여기에 특정 문제 getRootBeanClassClass를 반환하고, Mockito 최종 클래스을 조롱 수 없습니다. 후드 아래에서 클래스를 모의 할 것을 요청하면 Mockito는 모든 메서드를 (효과적으로) 재정의하고 Mockito 컨트롤로 리디렉션하는 하위 클래스를 생성합니다. 이 오버라이드 메커니즘은 final 메소드와 final 클래스 (java.lang.Class)를 조롱하는 데 어려움을 겪습니다. 당신이 PowerMock으로 끝낼 수있을하지만

, 그것은 2011 년 Johan Haleby's post from [email protected] 같이 권할 수있다 : 나는 모의 클래스에 가능성이 있다고 생각하지 않습니다

때문에 그 의지 엉망 많은의 PowerMock 내부 자료. MockGateway.MOCK_GET_CLASS_METHOD = true로 설정하면 Object의 getClass() 메소드를 어떻게 조롱 할 수 있습니다.

클래스 또는 getClass 메소드를 조롱하는 것에 대해 강력히 권고드립니다. 다른 방법으로 확인하십시오.

새 클래스 ("에서 myBean")를 만드는 것을 고려해, getSimpleName 수익 예측 값을 만들고 그것을 반환 할 getRootBeanClass() 설정에 대한 유일한 우려 때문입니다. 인터페이스에서 반환 값을 모의하기가 매우 쉽습니다. 사용하려고하는 것과 동일한 종류의 간단한 이름 반환 값을 얻게됩니다.