2017-06-01 65 views
0

メソッドのMockito + Junitテストを記述する必要があり、そのメソッドはプロパティファイルからデータを読み込みます。テストケースを実行しようとすると、プロパティファイルがロードされていますが、nullが返されます。以下は、私のコードです:プロパティファイルからプロパティを読み取るメソッドのMockito + Junitテストケースの書き方

@RestController 
@PropertySource("classpath:/com/example/prop.properties") 
public class ReadProp { 
@Value("${name}") 
private String name; 
@Value("${rollNo}") 
private String rollNo; 
@RequestMapping(value="/") 
public void getDetails(){ 
    System.out.println(name); 
    System.out.println(rollNo); 
    } 
} 
The test case is as follows 
@RunWith(MockitoJUnitRunner.class) 
@PropertySource("classpath:/com/example/prop.properties") 
public class ReadPropTest { 
@Mock 
private ReadProp readProp; 
@Value("${name}") 
private String name; 
@Value("${rollNo}") 
private String rollNo; 
    @Test 
    public void readValues() { 
    System.out.println(name); 
    System.out.println(rollNo); 
    readProp.getDetails(); 

    } 
} 
+0

あなたのテストはMockitoで実行されます。 MockitoはSpringについて何も知らないので、 '@ PropertySource'アノテーションは無視されます。大きな質問は、何をテストしたいですか?プロパティの読書部分?この場合、テストをスプリングテストにする必要があります。または、メソッドを使用すると、リフレクションを使用してプロパティを設定できます。あなたがテストしているクラスを嘲笑することは全く役に立たない。 –

+0

ここではメソッドをテストしたいだけです。そのメソッドのテストケースを実行すると、実際のクラスがロードされ、プロパティファイルからデータを読み込み、値を出力する必要があります。この機能は私のプロジェクトで問題を解決することができます – billa

+0

私はReadPropクラスの@Mock Annotationを削除しました。私はテストケースを走らせました..上記の機能はまだ動作していません...私に役立つサンプルやリファレンスを提供できるのであれば – billa

答えて

0

あなたのテストは、多くの問題、最初は、あなたが実際にテストするためには何も持っていないということで...

@Mock 
private ReadProp readProp; 

これを持っている...最初に起動するのをしてみましょう一緒に@RunWith(MockitoJUnitRunner.class)あなたのreadPropオブジェクトを模擬オブジェクトにします。モックオブジェクトにはロジックが含まれていません。メソッド名などを除いて、元のReadPropクラスとは何の関係もありませんが、メソッド自体は実際には何もしません(あなたに指示しない限り)。

したがって、最初の問題:あなたはRealPropクラスをテストするのではなく、模擬オブジェクトです。これは役に立ちません。あなたはRealPropオブジェクトのようにしか見えないものを作成していますが、それをテストしますが、もちろんそれは何も教えてくれません。モックはあなたのテストで依存関係を単純化するのに役立ちますが、モックを実際にテストするのは意味がありません。

だから、しないでください。代わりに、実際にRealPropにしてください。

次の質問は、あなたが何をしたいか、であるもう一つの問題は、のSystem.outをテストするために非常に良いではないこと、であるが、私はそれがちょうど一時的なコードだと仮定し、その者は、一瞬のためにそれを無視してみましょう...

テストする。 2つの可能性があります:

a)フィールド名とrollNoが使用している依存性注入フレームワーク(この場合はspring)によって正しく充填されていることを前提として、getDetailsメソッドを使用してテストしますそれらを正しく。

b)値の注入が機能し、メソッドgetDetailsがその値を使用していることをテストします。

これは2つの異なるテストです。 a)これはこの「ユニット」に限定されているため、真のユニットテストになります。 b)は、このユニットだけでなく、その周りの春の環境でも見るので、より複雑になります。これまでの統合テストとは言いませんが、単なる単体テスト以上のものです。

個人的には、私の単体テストではできるだけ避けようとしています。自分のコードに集中して、後で実際の統合テストでSpringの統合をテストします。

のは、始めましょう)...もちろん

public class ReadPropTest { 

     private ReadProp readProp = new ReadProp(); 

     @Before 
     public void init() { 
      Whitebox.setInternalState(readProp, "name", "someName"); 
      Whitebox.setInternalState(readProp, "rollNo", "someRollNo"); 
     } 

     @Test 
     public void myTest() { 
     ... 
     } 
    } 

は、あなたはまた、SpringのReflectionTestUtils代わりにMockitoのホワイトボックスの、重要ではありませんを使用することができます。

また、b)では、このようなことを試すことができます。もちろん、あなたの設定に依存するので、Migthは設定で少し遊んでいなければなりません。

@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@ContextConfiguration(locations = {"classpath:applicationContext-spring.xml" }) 
public class ReadPropTest { 
    @Autowired 
    private ReadProp readProp; 
    ... 
} 
関連する問題