gpt4 book ai didi

unit-testing - 未注入(inject)模拟对象

转载 作者:行者123 更新时间:2023-11-28 21:11:53 25 4
gpt4 key购买 nike

我尝试模拟 Controller :

@RestController
public class SthControl {
@Autowired
private ObjRepo repo;

@RequestMapping(value = "/dosth", method = RequestMethod.POST, produces = "application/json")
public ModelMap handleSth(@RequestParam("key") String key) {
final Logger logger = Logger.getLogger(getClass());

logger.info("Is Mock "+ new MockUtil().isMock(repo));//return FALSE- is real object
logger.info("Key " + repo.loadByKey(key);//return NULL- always call real Method

测试用例:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/mvc-dispatcher-servlet.xml")
@WebAppConfiguration
public class SthControlTest {
@SuppressWarnings("SpringJavaAutowiringInspection")
@Autowired
protected WebApplicationContext wac;
private MockMvc mockMvc;

@Mock
private ObjRepo repo;

@InjectMocks
@Autowired
private SthControl contr;

@Before
public void setup() {

MockitoAnnotations.initMocks(this);
this.mockMvc = webAppContextSetup(this.wac).build();

BasicConfigurator.configure();
}

@Test
public void testRegister() throws Exception {

final UUID uuid = UUID.randomUUID();
final String keyValue = "KeyVal";

final Logger logger = Logger.getLogger(getClass());

repo = Mockito.mock(ObjtRepo.class);
Mockito.when(repo.loadByKey(keyValue)).thenReturn(new Obj(uuid, keyValue, TimeUtils.currentTimeSecond(), false));

如果用这行替换@Mock Annotation,问题仍然存在

repo = Mockito.mock(ObjRepo.class);
ReflectionTestUtils.setField(contr, "repo", repo, ObjRepo.class);
logger.info("Obj " + repo.loadByKey(keyValue).getId());//return correct object
logger.info("Mock Is "+new MockUtil().isMock(ReflectionTestUtils.getField(contr,"repo")));//True

最佳答案

这里有两个问题。

  • 您需要交换行 this.mockMvc = webAppContextSetup(this.wac).build();MockitoAnnotations.initMocks(this);,否则,由 Spring Web 应用程序上下文设置完成的注入(inject)将覆盖 Mockito 完成的注入(inject)。始终先进行 Spring 注入(inject)。

  • 您需要从 testRegister 中删除行 repo = Mockito.mock(ObjtRepo.class);,因为该行替换了 中的值repo 与您注入(inject)的值不同,因此当您存入新值时,它不会影响 SthControl 的行为。

关于unit-testing - 未注入(inject)模拟对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22646266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com