2017-12-30 69 views
1

컨트롤러 테스트에서 빈 생성에 관한 질문이 있습니다. 예를 들어, @Service 주석 및 MainApplicationConfiguration.class 인 주석되는 그러한 테스트@Mock 주석의 의미는 무엇입니까?

@RunWith(SpringJUnit4ClassRunner.class) 
@ContextConfiguration(classes = {MainApplicationConfiguration.class, JPAConfig.class}) 
@WebAppConfiguration 
public class TestMainController { 

    private MockMvc mockMvc; 
    @Before 
    public void setUp() { 
    MockitoAnnotations.initMocks(this); 
    mockMvc = MockMvcBuilders.standaloneSetup(mainController).build(); 
    } 
    @InjectMocks 
    private MainController mainController; 

    @Mock 
    private EntryService entryService; 

    @Autowired 
    DBEntryRepository repository; 

    @Test 
    public void testEntryGet() throws Exception { 

     List<DBEntry> response_data = new ArrayList<>(); 
     response_data.add(new DBEntry(1, 1, "STR", "DATE")); 

     Mockito.when(entryService.findAllEntries()) 
       .thenReturn(response_data); 
     MvcResult result = mockMvc.perform(get("/VT/entry/")) 
       .andExpect(status().isOk()).andReturn(); 
     verify(entryService, times(1)).findAllEntries(); 
     verifyNoMoreInteractions(entryService); 
    } 
} 

/VT/항목에 매핑 된 제어 방법/

@RequestMapping(value = "/entry/", method = RequestMethod.POST) 
    public ResponseEntity<Void> createEntry(@RequestBody DBEntry entry, UriComponentsBuilder ucBuilder) { 
     System.out.println("Creating entry " + entry.getNum()); 
     try { 
      entryService.saveEntry(entry); 
      entryService.refreshEntryService(); 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return new ResponseEntity<Void>(HttpStatus.BAD_REQUEST); 
     } 
     HttpHeaders headers = new HttpHeaders(); 
     headers.setLocation(ucBuilder.path("/entry/{id}").buildAndExpand(entry.getId()).toUri()); 
     return new ResponseEntity<Void>(headers, HttpStatus.CREATED); 
    } 

EntryService 존재 @EnableWebMvc의 구성과이 프로젝트의 검사는 EntryService입니다.

저는이 컨트롤러가 실제로이 응용 프로그램에서이 EntryService을 사용하고 있으며 모두가 MainApplicationConfiguration.class에 의해 연결되어 있음을 보여주고 싶습니다.

질문 : entryService@Mock 인 이유가 내 테스트 실행 범위에서 내 컨트롤러 코드로 끝나는 이유는 무엇입니까? 그 인스턴스에 대해서만 존재해야하고 컨트롤러 내부에서 다른 bean (EntryService)을 인스턴스화해야합니다. 왜이 주석이 테스트 범위에서 해당 빈의 모든 항목을 조롱 했습니까? 나는 그것을 생각해 보았다. 나는 MainApplicationConfiguration.class 대신에 다른 모든 컨텍스트 웹 컨텍스트를 작성하여 그것을 조롱하고 현재 정의를 대체해야한다. 나는 왜이 간단한 주석으로 그런 것을 만들 었는지 혼란 스럽다.

누군가가이 마법을 이해할 수 있다면, @InjectMock과 @Mock의 차이점은 무엇입니까?

감사합니다. 내 질문이 아주 어리 석다면 미안해. 나는 아주 새롭다, 일한다, 그러나 나는 마술을 아직 얻지 않았다. 에서

답변

2

documentation@InjectMocks에 대한 :

Mockito는 EntryService 이후 그래서

이의 종속성입니다 위해 생성자 주입, setter 주입 또는 재산 주입에 의해서만 중 모의 객체를 삽입하려고 할 것이다 컨트롤러 인 @InjectMocks은 테스트 클래스에서 EntryService의 모의 객체를 찾아서 mainController에 삽입하려고합니다.

constructor injection, setter injection, or property injection 중 하나만 표시됩니다.

@Mock은 필드를 모의 객체로 표시합니다. @InjectMocks는 표시된 필드에 모의 객체를 삽입하지만 표시된 필드는 모의 객체가 아닙니다.

+0

질문의 주요 부분에 대한 대답이 아닙니다. – Alex

+0

@Alex 의견에 차이가 있습니다. 이 [post] (https://stackoverflow.com/questions/16467685/difference-between-mock-and-injectmocks)에서 더 많은 것을 볼 수 있습니다. –

+0

알다시피, 당신은 뭔가를 인용하려고하지만,이 인용문은이 질문에 대한 답이 아닙니다. (: 고마워요!) 내 EntryService에 @Mock 주석이 달려 있음 – Alex