2016-04-01 18 views
10

メインメソッドでコンソールと引数から入力を受け取るクラスを作成しました。 mainメソッドは、異なるコンソール入力に対して異なるメソッドを呼び出し、異なる引数に対して異なる関数を呼び出します。ですから、これらの入力をファイルから模倣して、Junitを使ってこのメインメソッドをテストしたいと思います。どうすればいい?クラスの主なメソッドをテストするためのjunitの特別な規定はありますか?junitによるメインメソッドのテスト

+3

代わりに処理方法をテストできませんでしたか?これはずっと効率的です。 – Berger

+0

私は正常に動作しているメソッドをテストしたが、私はmainメソッドをテストしたい。 – user2719152

+1

Javaプログラムの 'main'メソッドはそれだけです...メソッド!他の方法でも呼び出すことができます(特にテストメソッドから)。それであなたはどんな問題を抱えていますか? – Seelenvirtuose

答えて

6

は、ファイルからの入力を提供FileInputStreamを作成し、System.inストリームとしていることを設定することです。あなたはおそらく(...他のテスト、JUnitの自分自身を)主な方法は、それを使って何が後でまだ動作を確認するために完了した後に元を設定する

をお勧めしますここでは例です:

@Test 
public void testMain() throws IOException { 
    System.out.println("main"); 
    String[] args = null; 
    final InputStream original = System.in; 
    final FileInputStream fips = new FileInputStream(new File("[path_to_file]")); 
    System.setIn(fips); 
    Main.main(args); 
    System.setIn(original); 
} 

実際のコードでは、すべてのIOExceptionを処理し、ファイルへのフルパス(クラスローダー経由で取得)よりも優れたものを使用したいと考えていますが、これは一般的な考え方を示しています。

+0

しかし、fipsは最初の行だけを読むでしょう。ファイルの次の行に移動するにはどうすればよいですか? – user2719152

+0

私は 'Scanner'を使っているとき、私のために複数行のファイルでうまく動作します。私はそれがあなたの主な方法に依存するだろうと思いますか? –

1

あなたはこのようにJUnitテストからの主なメソッドを呼び出すことができます。

YourClass.main(new String[] {"arg1", "arg2", "arg3"}); 

しかし、主な方法は無効であると何も返さないので、あなたは、メインの呼び出し後に変更されたオブジェクトをテストする必要があります。ここで

はリンクHow do I test a method that doesn't return anything?

+0

はい、このように呼び出すことはできますがこの主な機能を実行した後、その動作が変わります...そして、私はそれを変更したくありません。 – user2719152

5

IMOメインメソッドをテストする最善の方法は、メインメソッドには絶対に何もせずに世界を設定してそれを蹴ることです。このように、単純な統合テストでは、「世界は設定されていますか」という答えが得られます。

他のすべての質問はもっと簡単に答えるようになります。

メインメソッドは、異なるコンソール入力に対して異なるメソッドを呼び出し、異なる引数に対して異なる関数を呼び出します。

someService.somemethod(args)を呼び出すべきではありません。このサービスは他のサービスと同様にテストされます。

だから、これらの入力をファイルから模倣することで、このメインメソッドをJunitでテストしたいと考えています。どうすればいい?

TemporaryFolder JUnitルールを使用しているか、何らかの形で偽のものが注入されています。

+0

私はしばしば、このようなコメントが "正しいこと"が示唆されているところを見る。私が常に同意している間、私たちは状況の全範囲をほとんど知りません。時には、あなたが変えることができない/変えられない、他の誰かのクレイムなコードやレガシークラフトをテストすることが時々あります。 –

+0

この場合正しい方法は正しい方法ではないかもしれませんが、答えのリストに正しい方法があることが重要だと思います。新しい開発者がこのページを突き抜け、「正しい方法」へのポインタがなくても「間違ったやり方」を見た場合、間違った考えを残してしまうかもしれません。 –

+0

それを主張することはできません。彼が主な方法をテストしていると、彼はそれを書いている可能性が非常に高いです。 –