什么是@Mock注释感?



>我有一个关于控制器测试中创建 bean 的问题。例如,有一个这样的测试

@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使用@Service注释进行注释,MainApplicationConfiguration.class是具有此EntryService@EnableWebMvc和扫描项目的配置。

通过这一点,我想表明该控制器确实在实际应用程序中使用此EntryService,并且所有控制器都通过MainApplicationConfiguration.class耦合。

问题是:为什么带有@Mock注释的entryService最终出现在测试执行范围内的控制器代码中?它不应该只针对该实例并且控制器内部应该实例化另一个 bean(EntryService),为什么这个注释模拟了该 bean 的所有出现(在测试范围内)?我在想,我应该写整个其他上下文网络上下文,而不是MainApplicationConfiguration.class在内部模拟它并替换当前定义。我完全困惑为什么这个简单的注释会做出这样的事情。

如果有人能理解这种魔力,请说@InjectMock和@Mock有什么区别?

感谢您的关注!对不起,如果我的问题很愚蠢。我很新,它有效,但我还没有魔法。

@InjectMocks的文档中:

Mockito将尝试仅通过构造函数注入,setter注入或属性注入来注入模拟

因此,由于EntryService是控制器的依赖项,因此@InjectMocks将尝试在测试类中找到EntryService的模拟对象并将其注入mainController

请注意,constructor injection, setter injection, or property injection中只有一个会发生。

@Mock将字段标记为模拟对象。 @InjectMocks 将模拟对象注入到标记的字段中,但标记的字段不是模拟字段。

相关内容

  • 没有找到相关文章

最新更新