如何测试@Cacheable可以使用jmockit和spring-test

时间:2015-08-14 14:14:23

标签: spring caching junit jmockit spring-test

我正在为带有@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注释无法工作)。

如何修复或重写测试?

0 个答案:

没有答案