我正在为带有@Cacheable
注释的应用程序代码编写集成测试。
应用程序为@Autowired
,测试由spring-test SpringJUnit4ClassRunner
运行。
代理实现是默认的 - JDK。 Jmockit正在嘲笑框架。
我想监视我的userDao调用次数,检查@Cacheable
是否真的有效。
正在测试的代码
public class UserServiceImpl implements UserService {
@Autowired UserDao userDao;
@Override
@Cacheable(value="userCache", key="#id")
@Transactional
public User findById(long id) {
User u = userDao.findById(id);
/* <...> fill more user data */
return u;
}
}
测试代码
import mockit.Injectable;
import mockit.NonStrictExpectations;
public class UserServiceImplTest {
@Autowired UserService userService;
@Injectable UserDao userDao;
@Test
public void findById_secondCallReturnsFromCache_doesntCallDatabase() {
new NonStrictExpectations() {{
userDao.findById(1); times = 1;
}};
userService.findById(1);
userService.findById(1);
}
}
然而,测试失败。 Jmockit @Injectable
UserDao
未注入弹簧上下文,因此不会计算任何调用。
第二次尝试:将@Autowired
UserService
替换为@Tested
,以使@Injectable
正常工作。测试失败,因为UserService
是一个接口。
第三次尝试:用@Autowired
UserService
替换@Tested
UserServiceImpl
。测试失败,因为@Cacheable
不起作用(现在使用JDK代理机制的@Cacheable
注释无法工作)。
如何修复或重写测试?