什么是@Mock注释感?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是@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
是@EnableWebMvc
和扫描项目的配置为这个EntryService
。
通过这个我想表明这个控制器真的在一个真正的应用程序中使用这个EntryService
,所有都由MainApplicationConfiguration.class
耦合。
问题是:为什么带entryService
注释的@Mock
最终出现在我的测试执行范围内的控制器代码中?不应仅仅是为了那个实例而且控制器内部应该实例化另一个bean(EntryService),为什么这个注释模拟了所有出现的那个bean(在测试范围内)?我在想,我应该编写完整的其他上下文web-context而不是MainApplicationConfiguration.class
来模拟它并替换当前的定义。我很困惑为什么这个简单的注释已经做了这样的事情。
如果有人能理解这种魔力,请说出@InjectMock和@Mock之间的区别是什么?
感谢您的关注!对不起,如果我的问题非常愚蠢。我很新,它有效,但我还没有魔法。
在documentation为@InjectMocks
:
Mockito将尝试仅通过构造函数注入,setter注入或属性注入来按顺序注入模拟
因此,由于EntryService
是你的控制器的依赖,@InjectMocks
将尝试在你的测试类中找到EntryService
的模拟对象并将其注入mainController
。
请注意,只会出现一个constructor injection, setter injection, or property injection
。
@Mock将字段标记为模拟对象。 @InjectMocks将模拟对象注入标记的字段,但标记的字段不是模拟。
以上是关于什么是@Mock注释感?的主要内容,如果未能解决你的问题,请参考以下文章
APIAuto:敏捷开发最强大易用的 HTTP 接口工具,机器学习零代码测试生成代码与静态检查生成文档与光标悬浮注释,集 文档测试Mock调试管理 于一体的一站式体验。