2017-08-05 14 views
0

私は、Spring RestコントローラのユニットテストにMockitoを使用するのが初めてです。ここに私のコントローラとテストコードがあります。サービスを模擬して例外をスローすることができません

@RestController 
@RequestMapping("/api/food/customer") 
public class CustomerController { 
    @Autowired 
    private CustomerService service; 

    @RequestMapping(method=RequestMethod.POST, produces= MediaType.APPLICATION_JSON_VALUE) 
    public ResponseEntity<Customer> addCustomer(@RequestBody Customer c){ 
     Logger log = LoggerFactory.getLogger(CustomerController.class.getName()); 
     try { 
      service.addCustomer(c); 
     } catch (UserNameException e){ 
      log.error("UserNameException", e); 
      return new ResponseEntity(HttpStatus.BAD_REQUEST); 
     } catch (Exception e){ 
      log.error("", e); 
      return new ResponseEntity(HttpStatus.BAD_REQUEST); 
     } 
     log.trace("Customer added: " + c.toString()); 
     return new ResponseEntity(c, HttpStatus.CREATED); 
    } 
} 

@RunWith(MockitoJUnitRunner.class) 
@WebMvcTest 
public class CustomerRestTest { 
    private MockMvc mockMvc; 
    @Mock 
    private CustomerService customerService; 
    @Mock 
    private CustomerDao customerDao; 
    @InjectMocks 
    private CustomerController customerController; 

    @Before 
    public void setup(){ 
     this.mockMvc = MockMvcBuilders.standaloneSetup(customerController).build(); 
    } 

    @Test 
    public void testAddDuplicateCustomer() throws Exception { 
     Customer myCustomer = mock(Customer.class); 
     when(customerService.addCustomer(myCustomer)).thenThrow(UserNameException.class); 
     String content = "{\"lastName\" : \"Orr\",\"firstName\" : \"Richard\",\"userName\" : \"Ricky\"}"; 
     RequestBuilder requestBuilder = MockMvcRequestBuilders.post("/api/food/customer").accept(MediaType.APPLICATION_JSON). 
       content(content).contentType(MediaType.APPLICATION_JSON); 
     MvcResult result = mockMvc.perform(requestBuilder).andReturn(); 
     MockHttpServletResponse response = result.getResponse(); 
     assertEquals(HttpStatus.BAD_REQUEST.value(), response.getStatus()); 
    } 
} 

私は私のサービス層を模擬しようとするとaddCustomerが呼び出されたときに、それは私のカスタム例外をスローしていています。私はBAD_REQUESTの代わりにHttpStatus.CREATEDを取り戻しています。適切に動作する可能性のあるサービスモックライン(その時のもの)とは何が違うのですか?

答えて

1

これは、when句内の特定の顧客インスタンスがと予想されるためですが、これは起こりません。 SpringはJSONをデシリアライズし、別のカスタマーインスタンスをメソッドに設定します。これに

when(customerService.addCustomer(myCustomer)).thenThrow(UserNameException.class); 

when(customerService.addCustomer(any())).thenThrow(UserNameException.class); 
+0

それをやったこと

はこれを変更してみてください!ありがとうdzatorsky。 –

関連する問題