2017-11-15 6 views
0

私は春のブートにはかなり新しく、基本的なマイクロサービスをまとめました(それはYelpのURLを受け取り、そのレストランの画像をスクラップします)。私は単体テストを書くのは良い時期だと思っていましたが、私が問題を抱えているのは、サーブレットのリクエスト/レスポンスのテストにモッククラスを注入することです。Springブート - サーブレットリクエスト/レスポンスのテスト、モッククラスの挿入方法?

私がテストしようとしているコードは非常にシンプルですが、このように見えます。これは基本的に私のサービスのエントリーポイントであり、JSON本体を受け取り、そこからYelp URLを抽出し、次にYelpRequestController.makeYelpRequest()はイメージをスクラップしてArrayList内のイメージリンクを返すことに注意します。

@RestController 
public class RequestController { 

    @PostMapping(value = "/") 
    public ArrayList<String> index(@RequestBody String reqBodyString) { 

     //my own function to parse the json string 
     HashMap<String, String> requestBody = parseReqBodyString(reqBodyString); 
     String yelpURL = requestBody.get("yelpURL"); 

     YelpRequestController yelpRequest = new YelpRequestController(yelpURL); 
     ArrayList<String> yelpImgLinks = yelpRequest.makeYelpRequest(); 
     return yelpImgLinks; 
    } 

} 

これは私のユニットテストコードです。それは基本的にJSON文字列を作成し、私のRequestControllerに要求を送信し、応答が大丈夫であることを確認します。今は通過しますが、テストではRequestControllerとそれ以外のテストはしません。現在は、テストからのURLをYelpRequestControllerに送信し、このテストでRequestControllerを隔離したいので、私が望まない画像のスクレイピングを開始します。私はYelpRequestControllerクラスを嘲笑して結果を返そうとしていましたが、本当にたくさんのトラブルを抱えています。

@RunWith(SpringRunner.class) 
@SpringBootTest 
@AutoConfigureMockMvc 
public class RequestControllerTest { 

    @Autowired 
    private MockMvc mvc; 

    @Test 
    public void postRequestController() throws Exception { 
     ObjectMapping jsonObject = new ObjectMapping(); 
     jsonObject.setYelpUrl("https://www.yelp.ca/biz/l-industrie-pizzeria-brooklyn"); 
     Gson gson = new Gson(); 
     String json = gson.toJson(jsonObject); 
     mvc.perform(MockMvcRequestBuilders.post("/") 
       .accept(MediaType.APPLICATION_JSON) 
       .content(json)) 
       .andExpect(status().isOk()); 
    } 
} 

私はMockitoを使用して、別のクラスをモック、あなたがテストしているクラスにそれを注入する方法を理解する方法について読んでてきました。しかし、私は本当にここでそれを適用しようとして立ち往生しています。どんな助けもありがとう。

+0

@RestController public class RequestController { @Autowired private YelpRequestController yelpRequest; @PostMapping(value = "/") public ArrayList<String> index(@RequestBody String reqBodyString) { //my own function to parse the json string HashMap<String, String> requestBody = parseReqBodyString(reqBodyString); String yelpURL = requestBody.get("yelpURL"); ArrayList<String> yelpImgLinks = yelpRequest.makeYelpRequest(yelpURL); return yelpImgLinks; } } 

をあなたのテストクラスでは、あなたは自動的に@Autowiredフィールドのためにそれを使用します@MockBeanと春と嘲笑しているしたいクラスに注釈を付けますYelpRequestControllerをSPring Beanにします。あなたのRequestControllerでそれをAutowireしてください。 yelpURLをコンストラクタではなくmakeYelpRequest()メソッドに渡して、ステートレスオブジェクトにします。その後、ユニットテストは、YelpRequestControllerをRequestControllerに挿入することができます。テスト容易性はすべて依存性注入に関するものです。 'new'を使って依存関係を自分で作成すると、モックの依存関係を挿入することができなくなります。 –

+0

ありがとうございました、私はそれを検討します! – user2889046

答えて

0

こんにちは私の答えはあなたに多くを助けることを願っています。あなたはMVCを初期化することができなければならないテストを開始する前に、以下の

@Autowired 
private WebApplicationContext context; 

private MockMvc mvc; 

@Before 
public void setUp() { 
    this.mvc = MockMvcBuilders.webAppContextSetup(this.context).build(); 
} 

をシンプル参照してください。したがって、テストの前にアプリケーションを準備する必要があります。あなたは、コントローラを注入する必要がSoringBoot

private MockMvc mockMvc; 

@InjectMocks 
private UserController userController; 

@Before 
public void init(){ 
    MockitoAnnotations.initMocks(this); 
    mockMvc = MockMvcBuilders 
      .standaloneSetup(userController) 
      .addFilters(new CORSFilter()) 
      .build(); 
} 

SpringMVC。

0

コメントに指摘されているように、コントローラで依存関係注入を使用して、テスト可能にすることができます。 この特定のコントローラをターゲットにしてWebMvcTestを使用できます。 SpringBootTestとは対照的に、これは完全なApplicationContextをロードしません。

これは、このようなものになります:

@RunWith(SpringRunner.class) 
@WebMvcTest(RequestController.class) 
@AutoConfigureMockMvc 
public class RequestControllerTest { 

    @Autowired 
    private MockMvc mvc; 
    @MockBean 
    private YelpRequestController yelpRequest; 

    @Test 
    public void postRequestController() throws Exception { 
     ObjectMapping jsonObject = new ObjectMapping(); 
     jsonObject.setYelpUrl("https://www.yelp.ca/biz/l-industrie-pizzeria-brooklyn"); 
     Gson gson = new Gson(); 
     String json = gson.toJson(jsonObject); 
     mvc.perform(MockMvcRequestBuilders.post("/") 
       .accept(MediaType.APPLICATION_JSON) 
       .content(json)) 
       .andExpect(status().isOk()); 
    } 
} 
関連する問題