2012-03-14 3 views

답변

36

과 같은 것이 있습니까? 변수가 있습니까? 내가 다시 부름을 부를 것이다. EasyMock 또는 PowerMock이 static final 필드를 다시 할당하는 쉬운 방법을 제공하지 않는다고 생각합니다. 이상한 유스 케이스처럼 들립니다.

디자인에 문제가있을 수 있습니다. 변수가 다른 값을 가질 수도 있고 심지어 테스트 목적 일지라도 static final (또는보다 일반적으로 전역 상수)을 사용하지 마십시오. 다음과 같이

static void setFinalStatic(Field field, Object newValue) throws Exception { 
    field.setAccessible(true); 

    // remove final modifier from field 
    Field modifiersField = Field.class.getDeclaredField("modifiers"); 
    modifiersField.setAccessible(true); 
    modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); 

    field.set(null, newValue); 
} 

를 사용 :

어쨌든, 당신은 (: Using reflection to change static final File.separatorChar for unit testing?에서) 반사를 사용하는 것을 달성 할 수

setFinalStatic(MyClass.class.getField("myField"), "newValue"); // For a String 

은 원래 값시에 필드를 다시 설정하는 것을 잊지 마세요 찢어지고.

+4

이것을 사용하는 사람은 자바 컴파일러가 상수를 인라인 할 수 있으므로 코드가 실제로 다른 최종 필드에 액세스하지 않을 수 있음을 명심해야합니다 (인라인 할 때 상수가 쓸모 없으므로 File.separatorChar에서 작동해야 함). 이 [이 질문에 설명되어 있습니다 (http://stackoverflow.com/questions/5173372/java-static-final-values-replaced-in-code-when-compiling) –

+0

변수를 다른 값을 경우에만 알고있는 동안 단위 테스트, 제안 된 접근 방식은 무엇입니까? – Sharif

5

PowerMock 기능의 조합을 사용하여 수행 할 수 있습니다. @PrepareForTest({...}) 주석을 사용하여 정적 조롱을하고 필드를 조롱 한 다음 (Mockito.mock(...)을 사용하지만 동등한 EasyMock 구조를 사용할 수 있음) WhiteBox.setInternalState(...) 메서드를 사용하여 값을 설정하십시오. 변수가 private 인 경우에도 작동합니다.

확장 예를 들어,이 링크를 참조하십시오 : http://codyaray.com/2012/05/mocking-static-java-util-logger-with-easymocks-powermock-extension

+1

참고 - "확장 예제의 링크"는 질문에서 언급 한 ** 정적 ** 필드가 아닌 ** 정적 ** 필드를 조롱하는 것을 의미합니다. –

-1

https://github.com/zhangyanwei/staticmock

  1. StaticMockito.enhanceClass ("xxx.Utility");
  2. StaticMockito.initMock (Utility.class);
  3. (Utility.toClientId (clientName)). thenReturn ("name"); verify (mocker (Utility.class)). toClientId (clientName);
관련 문제