2017-01-13 10 views
-1

のテストこれは私が書かれているコントローラクラスで、春/ Mockito - コントローラに

@RestController 
public class TranslatorController { 

    @Autowired 
    TransResponse transResponse; 

    @Autowired 
    TransRequest transRequest; 

    @Autowired 
    TransWorker worker; 

    @PostMapping(path = "/trans", consumes = { 
      MediaType.APPLICATION_JSON_VALUE }, produces = { 
        MediaType.APPLICATION_JSON_VALUE }) 
    public ResponseEntity<TransResponse> translate(@RequestBody TransRequest transRequest, 
      Errors error, HttpServletRequest request) { 

     logger.info("Starting translation::-->" + transRequest.getTerm()); 
     String trans = worker.trans(transRequest.getText()); 
     transResponse.setStatus("OK"); 
     transResponse.setTrans(trans); 
     transResponse.setMessage("SUCCESS"); 

     return new ResponseEntity<>(transResponse, HttpStatus.OK); 
    } 

} 

これは、このためのテストクラスで、成功

として渡す

@WebMvcTest(TranslatorController.class) 
@ComponentScan("com.demo.service") 
public class TranslatorControllerTest { 

    @Mock 
    TransRequest transRequest; 

    @Mock 
    Errors error; 

    @Mock 
    HttpServletRequest httpRequest; 

    @Mock 
    private TranslatorController controllerMock; 

    @Autowired 
    private MockMvc mockMvc; 

    @Mock 
    TransWorker worker; 

    @Mock 
    ResponseEntity<TransResponse> respEntity; 

    @Test 
    public void testTranslate() throws Exception { 
     Mockito.when(worker.trans(Mockito.anyString())).thenReturn("cold"); 
     TransResponse response = new TransResponse(); 
     response.setTrans("cold"); 
     respEntity = new ResponseEntity<TransResponse>(response, 
       HttpStatus.OK); 
     Mockito.when(controllerMock.translate(transRequest, error, httpRequest)).thenReturn(respEntity); 
     respEntity = controllerMock.translate(transRequest, error, httpRequest); 
     assertEquals("cold", respEntity.getBody().getTrans()); 
    } 
} 

そのしかし、私の質問は、私は正しくテストをしているのですか?それが正しくない場合。私が間違っているところで私を導くことができますか?

+1

あなたがここでテストしている正確に何を思いますか?あなたはすべてを嘲笑してしまった!ヘック、書いたモックの半分は決して呼ばれない。あなたは実装をコメントアウトしてテストをパスすることができます。これはあなたが間違ったことをしたかなり良い兆候です。あなたはTDDを調べたいかもしれません。実装が間違っているか、まだ書かれていないときに合理的な理由でテストが失敗することを確認することが重要です。 – jonrsharpe

+0

参考資料または例を提供してください – Umar

答えて

1

私はあなたが望むものをテストしているとは思わない。コントローラのtranslateメソッドをテストしようとしているようですが、コントローラをモックしたようです。テストしようとしていることを嘲笑してはいけません。もちろん

@RunWith(MockitoJUnitRunner.class) 
public class TranslatorControllerTest { 

    @InjectMocks 
    TranslatorController controller; 

    @Mock 
    TransResponse transResponse; 

    @Mock 
    TransRequest transRequest; 

    @Mock 
    TransWorker worker; 

    @Test 
    public void testTranslate() throws Exception { 
    Mockito.when(worker.trans(Mockito.anyString())).thenReturn("cold"); 

    TransResponse response = controller.translate(transRequest, null, new MockHttpServletRequest(); 
    Assert.assertEquals("cold", response.getBody().getTrans()); 
    } 

} 

これは、本質的に呼び出しているように、あなたも、あなたのTransWorkerクラスをテストする必要があります。

2

@WebMvcTestを使用するとよいと思います! TranslatorControllerを模倣しないでください。@WebMvcTestはインスタンスを提供します。

コントローラーの依存関係は、@MockBeanと注釈を付けることによって実現されます(モックされたインスタンスがコントローラーに注入されます)。

コントローラのメソッドを呼び出す代わりに、MockMvcを使用して、HTTP要求を送信します。この要求は、コントローラで捕捉されます。

ResultActions result = mockMvc.perform(MockMvcRequestBuilders 
         .post("/trans") 
         .accept(MediaType.APPLICATION_JSON) 

         //whatever JSON content expected as input 
         .content("{trans: \"something\"}"))); 

resultActions.andExpect(status().isOk()); 

//validates stuff.. 
resultActions.andReturn().getResponse().getContentAsString(); 

全体のテストクラス:

@RunWith(SpringRunner.class) 
@WebMvcTest(TranslatorController.class) 
public class TranslatorControllerTest { 

    @Autowired 
    private MockMvc mockMvc; 

    @MockBean 
    TransResponse transResponse; 

    @MockBean 
    private TransRequest transRequest; 

    @MockBean 
    TransWorker worker; 

    @Test 
    public void testTranslate() throws Exception { 
     Mockito.when(worker.trans(Mockito.anyString())).thenReturn("cold"); 

     ResultActions result = mockMvc.perform(MockMvcRequestBuilders 
           .post("/trans") 
           .accept(MediaType.APPLICATION_JSON) 

           //whatever JSON content expected as input 
           .content("{trans: \"something\"}"))); 

     resultActions.andExpect(status().isOk() 
        .andExpect(content().string("{trans: \"cold\"}")); 

     //validates stuff.. 
     resultActions.andReturn().getResponse().getContentAsString(); 
    } 
} 

これは、JSONペイロードを受信したときに、あなたが実際にあなたのコントローラの実際の動作をテストすることができます。そのメソッド(有効なテストかもしれません)を呼び出すだけであれば、無効なJSONシナリオやセキュリティチェック(ロール....などのユーザー)をテストすることはできません。 https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

ドキュメントには、例を示し

@RunWith(SpringRunner.class) 
@WebMvcTest(UserVehicleController.class) 
public class UserVehicleControllerTests { 

    @Autowired 
    private MockMvc mvc; 

    @MockBean 
    private UserVehicleService userVehicleService; 

    @Test 
    public void getVehicleShouldReturnMakeAndModel() { 
     given(this.userVehicleService.getVehicleDetails("sboot")) 
      .willReturn(new VehicleDetails("Honda", "Civic")); 

     this.mvc.perform(get("/sboot/vehicle") 
      .accept(MediaType.TEXT_PLAIN)) 
      .andExpect(status().isOk()) 
      .andExpect(content().string("Honda Civic")); 
    } 

}