2017-11-22 16 views
-1

필자는 (이 문제가없는 많은 다른 Util 클래스 중에서) private 생성자를 갖는 테스트에 실패한 FileUtil 클래스를 가지고 있습니다.리플렉션으로 선택하면 개인용 생성자가 공개가되는 이유는 무엇입니까?

클래스 정의는 다음과 같습니다 내가 개인 생성자를 가지고 테스트를 많은 다른 클래스가 위에서 언급 한 바와 같이

public final class FileUtil { 

    /** 
    * Hidden constructor to prevent instantiation. 
    */ 
    private FileUtil() { 
    } 
    // ... 
    // many static methods 
} 

.

@Test 
public void testPrivateConstructor() throws Exception { 
    Constructor<FileUtil> constructor = FileUtil.class.getDeclaredConstructor(); 
    Assert.assertTrue("Constructor is not private", Modifier.isPrivate(constructor.getModifiers())); 
    constructor.setAccessible(true); 
    constructor.newInstance(); 
} 

그러나이 클래스 - 만이 클래스 - isPrivate() 메서드는 false를 반환하고 디버거에서 확인하면 생성자가 실제로 public으로 표시됩니다 : 시험 방법이다. 그러나 생성자를 프로그래밍 방식으로 호출하려고 시도하면 Eclipse는 메서드가 표시되지 않는다고 전합니다.

나는 이클립스와 메이븐과 함께 일하고 있는데, 이클립스와 메이븐 빌드를 호출 할 때 커맨드 라인에 문제가있다. 그래서 실제로 자바 문제입니다. 그러나이 패턴을 문제없이 라이브러리에서 사용하기 때문에이 클래스에서만 실패하는 이유는 알 수 없습니다.

의견이 있으십니까?

+0

'FileUtil'은 일반적인 이름이기 때문에 다른 'FileUtil' 클래스를 사용하고있을 수도 있습니다. 어쨌든 위 코드는'isPrivate'에'false'를 부여해서는 안됩니다. – tsolakp

+2

[mcve]를 분리하여 테스트 했습니까? 나는 해냈고 잘 작동하기 때문에 @tsolakp와 @DwB의 제안은 정확할 것이라고 거의 확실하다 ... 당신은 다른'FileUtil'을보고있다. 이와 같은 것들을 위해서 항상 게시하기 전에 [mcve]를 만드십시오. 문제를 직접 발견하지 못하면 게시물을 올리면 누구나 신속하게 재현하고 확인할 수 있습니다. –

+0

@JimGarrison이 이것을 지적 해 주셔서 감사합니다. 예제를 만들 때 아래의 해결책을 찾았습니다 ;-) –

답변

1

첫 번째 추측; 이들은 당신이 찾고 FileUtil되지 않습니다. . 예 :

System.out.println("FileUtil classname: " + FileUtil.class.getName()); 
0

답장을 보내 주셔서 감사합니다. 그러나이 문제는 완전히 다른 것으로 인해 발생했습니다.

다른 테스트에서는이 클래스의 일부 메소드를 조롱해야했습니다. 모든 메소드가 정적이므로 사용해야만합니다. 유닛 테스트 클래스에서는

@PrepareForTest(FileUtil.class) 

을 사용했습니다. 이것이 필자가 testPrivateConstructor() 메소드에서 public 생성자를 사용하여 모의 객체를 얻은 이유라고 생각됩니다.

별도의 테스트 클래스를 조롱해야하는 모든 테스트를 리팩토링하고 testPrivateConstructor() 메소드가 포함 된 테스트 클래스에서 @PrepareForTest (FileUtil.class)를 제거했습니다. 이제 예상대로 작동합니다.

누군가가 동일한 문제를 다시 실행하면 도움이되기를 바랍니다.