0

我试图在 Spring/Hibernate 中模拟一个 DAO 方法,它接受一个对象并返回一个对象。

Mockito.when(mockedDao.findByProperty(c)).thenReturn(state);

c对象具有键值对,例如“name”、“ben”。state对象将具有就业状态。

但是当我运行测试时它返回null。我认为这是因为criteria我在单元测试中传递的参数并不完全相同,尽管它们是相等的。我该如何解决这个问题?这里的条件是一个具有与休眠条件无关的键值的对象......

这是“service.getELementByName”:

    @Override
@Transactional
public State getElementByName(Object value) {
    Criteria c = new Criteria();
    c.property = "state_name";
    c.value = (String) value;
    State result = (State) stateDAO.findByProperty(c);
    return result;
}

请建议!谢谢


编辑代码看起来像这样

private State state;

@Mock
private StateDAO mockedDao;
@InjectMocks
private StateServiceImpl service;

@Before
public void init() {
    // mockedDao = mock(StateDAO.class);
    Criteria c = new Criteria();
    c.property = "state_name";
    c.value = (String) "Virginia";
    state = new State();
    state.setId(20);
    state.setIntPtLat(37.5222512);
    state.setIntPtLon(-78.6681938);
    state.setStateName("Virginia");
    Mockito.when(mockedDao.findByProperty(eq(c))).thenReturn(state);
    // service = new StateServiceImpl<State>();
}

@Test
public void testFindByProperty() {

    state = new State();
    state.setId(20);
    state.setIntPtLat(37.5222512);
    state.setIntPtLon(-78.6681938);
    state.setStateName("Virginia");

    Criteria c = new Criteria();
    c.property = "state_name";
    c.value = (String) "Virginia";
    Mockito.when(mockedDao.findByProperty(eq(c))).thenReturn(state);
    service.getElementByName("Virginia");
    State result = (State) service.getElementByName("Tes");
    assertEquals(state, result);
}
4

2 回答 2

3

如果您需要根据Criteria传递给的特定实例添加行为,findByProperty那么您需要深入了解 Mockito 认为它不一样的原因 - 在发布更多代码之前,我们无能为力!

但是,如果不是这种情况并且任何实例都可以,那么您可以使用参数匹配器来放松一下,例如:

Mockito.when(mockedDao.findByProperty(any(Criteria.class))).thenReturn(state);

就像我说的那样,这取决于您要测试的内容。

我希望这会有所帮助。

于 2013-01-08T14:32:39.750 回答
2

你在任何地方打电话给 Mockito.initMocks(this) 吗?如果没有,那可能是你的问题。

于 2013-01-08T15:07:35.420 回答