2017-11-22 4 views
-1

私は(この問題を持たない他の多くのUtilクラスの中でも)プライベートコンストラクタを持つテストに失敗した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を返し、デバッガで確認する場合は、コンストラクタは確かに公共のものとして示されている:試験方法はあります。しかし、コンストラクタをプログラムで呼び出そうとすると、Eclipseはメソッドが表示されていないことを通知します。

私はEclipseとMavenで作業しています。問題はMavenビルドを呼び出すときにEclipseとコマンドラインに表示されます。だから本当にJavaの問題ですが、私はこのパターンを問題なくライブラリに使用しているので、なぜこのクラスで失敗するのか分かりません。

どのような考えですか?

+0

'FileUtil'は一般的な名前なので、別の' FileUtil'クラスを使用している可能性があります。いずれにしても、上記のコードはそのままで、 'isPrivate'に' false'を与えるべきではありません。 – tsolakp

+2

これを単独でテストするには[mcve]を作成しましたか?私はやったし、うまく動作するので、@tsolakpと@DwBの提案は正しいと確信しています...あなたは別の 'FileUtil'を見ています。このようなものについては、投稿する前に必ず[mcve]を作成してください。自分で問題が見つからない場合は、投稿するときに誰かがすぐに再現して検証できることがあります。 –

+0

@ジムガリソンはこれを指摘してくれてありがとう。私は例を作成するときに以下の解決策を見つけました;-) –

答えて

1

最初の推測。これらはあなたが探しているFileUtilではありません。

プリントアウトFileUtil.class.getName()。 例:

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

回答ありがとうございます。しかし、この問題はまったく違うものによって引き起こされました:

私はこのクラスのいくつかの方法を模擬しなければなりませんでした。すべてのメソッドが静的であるため、私はユニットテストクラスで

@PrepareForTest(FileUtil.class) 

を使用しなければなりませんでした。これが、私がtestPrivateConstructor()メソッドでpublicコンストラクタを使ってモックオブジェクトを得た理由だと思います。

私は、別のテストクラスに戸惑いする必要のあるすべてのテストをリファクタリングし、testPrivateConstructor()メソッドを含むテストクラスから@PrepareForTest(FileUtil.class)を削除しました。今は期待どおりに動作します。

誰かが同じ問題に再び遭遇した場合に役立ちます。

関連する問題