컨트롤러 테스트에서 빈 생성에 관한 질문이 있습니다. 예를 들어, @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의 차이점은 무엇입니까?
감사합니다. 내 질문이 아주 어리 석다면 미안해. 나는 아주 새롭다, 일한다, 그러나 나는 마술을 아직 얻지 않았다. 에서
질문의 주요 부분에 대한 대답이 아닙니다. – Alex
@Alex 의견에 차이가 있습니다. 이 [post] (https://stackoverflow.com/questions/16467685/difference-between-mock-and-injectmocks)에서 더 많은 것을 볼 수 있습니다. –
알다시피, 당신은 뭔가를 인용하려고하지만,이 인용문은이 질문에 대한 답이 아닙니다. (: 고마워요!) 내 EntryService에 @Mock 주석이 달려 있음 – Alex