2017-04-19 12 views
0

スプリングブート1.5.2.RELEASEを使用して作成した私のspring-data-rest webappには、次のspock integrationtaionテストがあります。スプリングブートの統合テスト:Autowiredメンバーにnullメンバーがあります

@SpringBootTest(classes = com.my.server.Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
class MyWebAppSpec extends Specification {  

    @Autowired 
    DemoData demoData; 

    def setup() { 
     createDemoData(); 
    }  

    private void createDemoData() { 
     if (demoData.myMap.keySet().size() == 0) { 
      demoData.load(); 
     }   
    } 
... 
} 

DEMODATAクラスは、次のようになります。

@Component 
public class DemoData { 

    public Map<String, String> myMap = new HashMap<>(); 

    public void load() {...} 
... 
} 

私が発見しています何MyWebAppSpec demoData.myMapのcreateDemoData方法ではなく、空の地図よりもヌルであるということです。 DemoDataクラスの空のマップとして初期化すると、どうしてですか?どうすれば修正できますか?

答えて

0

なぜ私はDemoDataメンバーのmyMapがnullになっているのか分かりませんが、問題の修正が決定しました。

修正点は、DemoDataメンバーのmyMapをprotected/privateにして、それにアクセスするアクセサメソッドを追加することです。これは問題を解決します。私はこれがCGLIBプロキシを使った春とpointcutsの定義のためかもしれないと推測しています。おそらく、その春のバグは修正される可能性がありますか?

@SpringBootTest(classes = com.my.server.Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) 
class MyWebAppSpec extends Specification {  

    @Autowired 
    DemoData demoData; 

    def setup() { 
     createDemoData(); 
    }  

    private void createDemoData() { 
     if (demoData.getMyMap().keySet().size() == 0) { //NOTE accessor method used here 
      demoData.load(); 
     }   
    } 
... 
} 

と私のDEMODATAクラスは、次のようになります:次のような回避策で

は私のテストコードが見えます

@Component 
public class DemoData { 

    protected Map<String, String> myMap = new HashMap<>(); //NOTE: member is protected now 

    public Map<String, String> getMyMap() { //NOTE: Accessor method added here 
     return myMap; 
    } 


    public void load() {...} 
.. 

。 }

関連する問題