我有一个分层的应用程序,如下所示:
@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
注释,因此我使用SpringJUnit4ClassRunner
来创建测试AuthenticationManager
和MyController
。
如果@ContextConfiguration
不包含任何匹配MyService
的bean,则测试初始化失败,因为它无法解析bean。
如果我不需要AOP,我会使用Mockito测试运行器并注入Mockito.mock(MyService.class)
。但是如果我尝试使用spring runner,那么我的测试再次失败,因为它无法解析服务的MyDao
(即使服务是模拟的)。
我绝对不想模仿整个对象图。我宁愿停止使用模拟服务。我该怎么办?
答案 0 :(得分:2)
您的MyService应该实现一个接口,您应该模拟接口而不是类。那么您将不需要DAO实现。您可能也可能遇到类似的问题,我在尝试测试Jersey中的JAX-RS资源类时遇到了这个问题。问题是如何将单个bean部署到Spring容器中,但是模拟其依赖项。我写了一个blog post就可以帮助你解决这个问题。特别是,final solution可能会有所帮助。