2017-01-18 18 views
0

この問題はこのWebサイトと他の場所で広く調査されていますが、推奨される解決策は私にとってはうまくいきませんでした。Spring RESTful(Gradle):@Autowired results in NullPointerException

私は問題(bootRun)なしでSpringアプリケーション自体を実行できます。したがって、これはjUnit関連の問題だと思います。 SearchControllerUnitTestクラスでGradleテストまたはJUnitテストを実行しようとすると、NullPointerExceptionが発生します。

誰でも私の設定が間違っていることを指摘できますか?

ありがとうございました!

SearchControllerUnitTest.java

@Category(UnitTest.class) 
    @RunWith(SpringJUnit4ClassRunner.class) 
    @ContextConfiguration(classes = AppConfig.class) 
    public class SearchControllerUnitTest extends UnitTest { 

     private MockMvc mockMvc; 

     @Override 
     @Before 
     public void setUp() { 
      super.setUp(); 
      mockMvc = MockMvcBuilders.standaloneSetup(new SearchController()).build(); 
     } 

    @Test 
    public void getProductTest() throws Exception { 
     . . . 
    } 

SearchController.java

@RestController 
    public class SearchController { 

     public static final Logger log = LoggerFactory.getLogger(SearchController.class); 

     @Autowired 
     Product product; // <<< autowiring not working in jUnit only 

     @Autowired 
     ProductService productService; // <<< autowiring not working in jUnit only 

     @RequestMapping(value = "/search", method = RequestMethod.GET, produces = "application/json") 
     public ResponseEntity<Product> getProduct(@RequestParam(value = "name", required = true) String name) { 

      if (productService == null) { 
       log.info("productService is null!!"); 
      } 
      . . . 

      product = productService.getProduct(name); // <<<< NPE here 
     } 

ProductService.java

public interface ProductService { 
     . . . 
     public Product getProduct(String productName); 
     . . . 
    } 

ProductServiceImpl.java

@Service 
    public class ProductServiceImpl implements ProductService { 

     public Product getProduct(String productName){ 
      . . . 
     } 

    } 

例外:

Caused by: java.lang.NullPointerException 
    at com.somepckagename.controller.SearchController.getProduct(SearchController.java:36) 
+0

テストコンテキストに配線が定義されていますか? – Makoto

答えて

1

あなたはラインmockMvc = MockMvcBuilders.standaloneSetup(new SearchController()).build();にSearchController自分自身のインスタンスを作成しています。それを行うと、SpringはそれがBeanであることを知らないので、autowiringはもちろん動作しません。

@Autowired 
private SearchController controller; 

をし、そのインスタンスを使用します。

代わりにコントローラを注入するために、あなたのテストのフィールドを作成します。フィールドインジェクションの代わりにコンストラクタインジェクションを使用するのも理にかなっています。

+0

ありがとうございました。それはトリックでした。私は春には新しく、まだ学びます。 :) – BustedSanta

関連する問題