2017-09-27 10 views
0

Lauri에 의해 작성된 답변을보고 Mockito mock of SecurityManager throwing an exception에 보안 관리자를 조롱하여 단위 테스트를 작성했습니다. 아래는 테스트 케이스powermokito를 사용하여 보안 관리자를 모방 할 수 없음

@RunWith(PowerMockRunner.class) 
@PrepareForTest(System.class) 
public class TestClass { 
    @Test 
    public void testcheckSecurity() { 
     //mocking the System class 
     PowerMockito.mockStatic(System.class); 
     SecurityManager secMan = PowerMockito.mock(SecurityManager.class); 
     PowerMockito.when(System.getSecurityManager()).thenReturn(secMan); 
     List<String> allowedClasses = Arrays.asList("ClassA", "ClassB", "ClassC", "ClassD"); 
     BaseUtils.checkSecurity(allowedClasses); 

    } 
} 

이며,이

public class BaseUtils{  
public static void checkSecurity(List<String> allowedClasses) { 
     SecurityManager secMan = System.getSecurityManager(); 
     if (secMan != null) { 
      StackTraceElement[] trace = Thread.currentThread().getStackTrace(); 
      String callingClass = trace[3].getClassName(); 
      if (!allowedClasses.contains(callingClass)) { 
       secMan.checkPermission(new ManagementPermission("control")); 
      } 
     } 
    } 
} 

아래의 정적 방법을 테스트하지만 테스트 케이스를 디버깅 할 때, SecurityManager secMancheckSecurity(List<String> allowedClasses) 방법 null입니다.

내가 뭘 잘못하고 있니? 이 문제를 해결하도록 도와주세요.

+0

JUnit 4.12, PowerMock 1.7.0 및 Mockito 2.7.19 – glytching

+0

과 함께 테스트에 통과했습니다. 시스템에 보안 관리자가있을 수 있습니다. 보안 관리자가 설정되지 않은 시스템에서이 작업을 실행합니다. –

답변

1

사전에

덕분에 당신은 당신이 here

을 찾을 수 있습니다이 같은 방법으로 수행해야합니다 왜 documentation 및 설명에서 찾을 수 있습니다 @PrepareForTest(BaseUtils.class)

대한 자세한 내용처럼, @PrepareForTest 아닌 System.classBaseUtils.class를 추가해야

+0

'BaseUtils'의 메소드가 테스트 중이므로 왜 테스트 된 클래스를 조롱하고 있는지 묻습니다. 만약 그것이 조롱했다면 우리는 실제 구현이 아니라 조롱 된 객체를 테스트하고 있습니다. –

+0

클래스를 조롱하도록 요청하지 않습니다. '@ PrepareForTest' 어노테이션은 클래스가 조롱되었다는 것을 의미하지 않으며, 클래스의 바이트 코드가 일부 기능을 사용하도록 수정되었음을 의미합니다. 이러한 기능 중 하나는 조롱 된 시스템 클래스를 호출하는 기능입니다. 더 자세한 정보를 얻을 수있는 링크를 제공했습니다. –