2013-08-29 8 views
5

javaでクラスプライベート(パッケージの可視性を持つ手段)をどのようにするか?プライベートクラスのユニットテスト

私はパッケージを持っていますが、このパッケージには1つのクラスだけが公開されています。他のクラスはプライベートです。他のクラスのユニットテストをカバーするには?私は瓶の中に単体テストを入れたいと思っています。

+0

は彼らがプライベートまたはパッケージプライベートで?彼らがパッケージプライベートならば、テストは同じパッケージに入っていれば(他のクラスと同様に)、他のクラスのようにテストすることができます... – assylias

答えて

9

ユニットテストクラスを同じパッケージに作成します。

com.example.MyPrivateClasssrc/main/java/com/example/MyPrivateClass.java

に位置している場合例えば、次にテストクラスが同じパッケージcom.example.MyPrivateClassTestCaseになり、@ Kowserの答えに示すようにsrc/test/java/com/example/MyPrivateClassTestCase.java

2

に配置されます、テストは同じにすることができパッケージ。

Eclipseでは、私は他のIDEを想定していますが、異なるプロジェクトで同じパッケージ内にクラスを持つことができます。プロジェクトは別のプロジェクトに依存すると宣言され、他のプロジェクトのクラスが利用可能になります。これにより、プロダクションプロジェクトに依存し、パッケージ構造に従いますが、独自のルートディレクトリがある別個の単体テストプロジェクトが可能になります。

この構造によって、テストコードは実動コードから完全に分離された状態に保たれます。

3

これを行うには2通りの方法があります。

標準的な方法は、テストするクラスの同じパッケージにテストクラスを定義することです。現代のIDEがデフォルトでテストされているクラスの同じパッケージにテストケースを生成するので、これは簡単に行うべきです。

標準ではありませんが非常に便利なのは、反射を使用する方法です。これにより、プライベートメソッドを「パッケージプライベート」ではなく「プライベート」として定義することができます。たとえば、クラスがあるとします。

class MyClass { 
    private Boolean methodToBeTested(String argument) { 
     ........ 
    } 
} 

あなたはこのようなあなたの試験法持つことができます。

class MyTestClass { 

    @Test 
    public void testMethod() { 
     Method method = MyClass.class.getDeclaredMethod("methodToBeTested", String.class); 
     method.setAccessible(true); 
     Boolean result = (Boolean)method.invoke(new MyClass(), "test parameter"); 

     Assert.assertTrue(result); 
    } 
} 
関連する問題