我有一个分层的应用程序,看起来像这样:
@PreAuthorize('isAuthenticated()')
@Controller
public class MyController {
@Autowired
MyService service;
}
@Service
public class MyService {
@Autowired
MyDao dao;
}
public interface MyDao {
}
@Repository
public class MyDaoImpl implements MyDao {
}
我想测试依赖aop的@PreAuthorize
注释,所以我使用创建测试AuthenticationManager
和MyController
的SpringJUnit4ClassRunner
。
如果@ContextConfiguration
不包含任何与MyService
匹配的bean,则测试初始化失败,因为它无法解析bean。
如果我不需要AOP,我会使用Mockito测试运行器并注入Mockito.mock(MyService.class)
。但是,如果我尝试使用spring runner,我的测试再次失败,因为它无法为服务解析MyDao
(即使服务是mock)。
我绝对不想模拟整个对象图。我宁愿它停止在嘲笑服务。我该怎么做呢?
你的MyService应该实现一个接口,你应该模拟接口而不是类。这样就不需要DAO实现了。您可能也会遇到我在Jersey中测试JAX-RS资源类时遇到的类似问题。问题是如何将单个bean部署到Spring容器中,但模拟其依赖关系。我写了一篇关于它的博文,如果这是你所面临的问题,可能会对你有所帮助。特别是,最终的解决方案可能会有所帮助。