2016-09-09 1 views
4

私は、プロパティファイルをロードするServletListenerを検証するためのテストを作成するのに苦労しています。私はそれがうまく動作し、それがclasspathのファイルを見つけるアプリケーションを実行するときにテストしました。しかし、私はそれのためのテストを作成する方法を知らない。私の考えは、テストプロパティで一時ファイルを作成し、プロパティがSystem propertiesに入れられていることを確認することです。しかし、私はいつも正しい場所にファイルを作成することができません。テストから実行するときのgetResourceAsStream( "file")の検索はどこですか?

/target/test-classesにファイルを作成しようとしましたが、アプリケーションのルートに直接作成しようとしましたが、見つけられませんでした。何か案が?

これは、私がテストしようとしているコードです:

public class PropertyReadingListener implements ServletContextListener { 

    public static final String PROFILES_PROPERTIES = "profiles.properties"; 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     Properties propsFromFile = new Properties(); 
     try { 
      propsFromFile.load(getClass().getResourceAsStream(PROFILES_PROPERTIES)); 
     } catch (final Exception e) { 
      log.warn("Unable to find {}, using default profile", PROFILES_PROPERTIES); 
     } 
     propsFromFile.stringPropertyNames().stream() 
      .filter(prop -> System.getProperty(prop) == null) 
      .forEach(prop -> System.setProperty(prop, propsFromFile.getProperty(prop))); 
    } 
} 

感謝。あなたが行うとき

+1

良い単体テストは、協力するクラスの動作を嘲笑して外部依存関係(ファイルなど)を排除します。これは、簡単に実行できるテストを作成できるようにするための良い方法です(つまり、ファイルのデプロイやJARでのアプリケーションのパッケージ化について心配する必要はありません)。 – EJK

+1

mavenでyorプロジェクトをビルドしていますか?次に、テストプロパティファイルをsrc/test/resourcesに配置することができます。これは、テストクラスでのみ使用できます。 getResourceAsStream( "/" + filename)でロードします。 –

答えて

0

は基本的にDifferent ways of loading a file as an InputStream

を参照のgetClass()。あなたのPropertyReadingListenerがcom.company.listeners.PropertyReadingListenerであるならば、それはなります..だから、それはファイルのために、そのクラスのパッケージを検索しますgetResourceAsStream com/company/listenersのプロパティファイルを参照してください。テスト容易化

、私はテストはconvienentように入力ストリームを作成することができるようにリスナーのInputStreamに通過すると、コード内のクラスの実際のユーザは、入力ストリームに渡すことができgetResourceAsStream

+0

リンクありがとうございます。これは、クラスとクラスローダーを使ってファイルをロードすることの違いを明確にしました。それは基本的に私がやっていなかったことだった、クラスローダーを使用する。 – Kilian

+0

私は "/"とgetClass()。getResourceAsStream()でパスを使用しようとしなかったので、多くのことをやってみました。私は今、両方のオプションを試して、彼らは動作します。 – Kilian

1
から返さ

テストから実行するときにgetResourceAsStream( "file")を検索する場所はどこですか?あなたがファンキーな何かを行っている場合を除き、あなたのユニットテストは、デフォルトのクラスローダによってロードされ、それは通常のJVMクラスパスが検索されるとのことを意味....あなたはJUnitの話をしていることを

を想定し

(JUnitの4あなたが別のクラスローダを使用することができます:https://stackoverflow.com/a/9192126/139985を参照)


しかし、私は常に正しい場所にファイルを作成するために失敗します。

実際の問題は、Javaクラスパスとクラスパス検索の仕組みを理解しているようです。 JUnitランナーの実際のクラスパスが何であるかを理解している場合は、クラスローダーがそのプロパティファイルを見つけるためにプロパティファイルをどこに置くべきかが明白でなければなりません。あなたの特性は、ここにファイルを置く、あなたはMavenを使用していると仮定すると

+0

あなたは正しいです、私はそれがどのように機能したのか正確にはわかりませんでした。私はそれがクラスパスからロードするはずだと思ったが、クラスまたはクラスローダーを使用するかどうかに依存しているかどうかは分からなかった。 – Kilian

1

src/test/resources/foo.properties 

Mavenのリソースプラグインは

target/test-classes/foo.properties 
で試験 - をファイルの(おそらくフィルター)のコピーを配置しますclassesディレクトリがクラスパス上にあるので、このようなファイルを参照します(ファイル名の前にスラッシュを付けます)。

... getResourceAsStream("/foo.properties"); 
関連する問題