【发布时间】:2012-04-09 13:17:07
【问题描述】:
我需要测试一个服务类,但是当我尝试模拟 dao 类时,它没有被触发,因此无法使用 ThenReturn()。
我认为问题在于我在服务类(Spring MVC 3.1)中为我的 Dao 和 @Autowired 使用了一个接口:
界面:
public interface TestDao {
int createObject(Test test) throws NamingException;
}
实现:
@Repository
public class TestDaoImpl implements TestDao {
@Override
public int createObject(Test test) {
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new InsertNewTest(test), keyHolder);
return ((java.math.BigDecimal)keyHolder.getKey()).intValue();
}
}
服务:
public class RegTest {
@Autowired
TestDao testDao;
public int regTest(int .....) {
.
.
int cabotageId = testDao.createObject(test);
}
}
在测试中我有:
@RunWith(MockitoJUnitRunner.class)
public class TestRegService {
@InjectMocks
private RegTest regTest = new RegTest();
@Mock
TestDao testDao;
@Test()
public void test() {
.
when(testDao.createObject(null)).thenReturn(100);
.
}
testDao.createObject(null) 返回 0(由于被模拟)而不是 100,因为我试图实现。
有人可以帮忙吗?
问题解决了!
传递给 createObject() 的测试对象不匹配。使用
testDao.createObject(any(Test.class))
成功了!
【问题讨论】:
-
我试图重现您的问题,但是当我这样做时,我得到了适当的返回值。您如何检查 createObject 的结果?你可以在你的
when电话之后,简单地System.out.println(testDao.createObject(null))看看它说了什么。如果它说 100,那么你就知道问题出在测试上,而不是模拟上。如果它说 0,那么它是 Mockito 的某种错误。 -
嗯...它说 0 :-( 在将其报告为错误之前,我会尝试其他建议...
标签: spring unit-testing mocking mockito