【问题标题】:Mock object is not injected模拟对象未注入
【发布时间】:2014-03-25 21:07:36
【问题描述】:

我尝试模拟控制器:

@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

【问题讨论】:

    标签: unit-testing spring-mvc testing junit mockito


    【解决方案1】:

    这里有两个问题。

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

    • 1234563 '不影响SthControl的行为。

    【讨论】:

    • 你不懂我@David Wallace。手动创建的Mock@InjectMock 有同样的效果。控制器总是包含“真实”的对象——就像没有模拟一样。
    • 好的。你能用调试器检查SthControl对象内部repo的值在调用this.mockMvc = webAppContextSetup(this.wac).build();之前和之后是否相同?可能是 Spring Web 应用程序上下文设置正在替换 Mockito 注入的值。
    • 是的,调试器显示Mock 被spring 替换了。怎么解决??
    • 不幸的是,我没有选项删除答案。
    • 我已经编辑了我的答案,以考虑到 Spring 问题以及冗余模拟创建。
    猜你喜欢
    • 1970-01-01
    • 2012-03-16
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多