我遇到以下情况:我正在编写单元/集成测试代码,需要测试缓存一致性。我正在通过这项工作建立自己的测试自动化知识,所以我不能称自己为专家。
我有一个常规Manager -> DAO -> Hibernate Session -> JDBC (H2)
结构,我认为通过将实际的DAO连接为bean而不是模拟它来测试管理器会更便宜。当然DAO有自己的测试套件,超出了范围。我知道从测试设计的角度来看,我正在编写的更多是集成测试而不是单元测试,因为真正单一的测试应该只显示被测试的组件1模拟了-st级依赖项。但是,正如我所说,模拟每个DAO调用比连接H2更昂贵。
对于缓存测试,我想编写测试以确保在某些情况下调用或不调用DAO。使用Spring缓存注释完成缓存。 Certain conditions
表示调用方法组合以确保正确更新或无效缓存。
现在我发明了一种棘手的方法:通过在管理器对象中反射性地将DAO设置为null来模拟连接中断。这非常好(而且很有趣)因为我可以依赖NullPointerException
。
真的,这不是一个专业的解决方案。
我知道Mockito可以spy
真实物品,还有interesting discussions如何进行间谍活动。
所以我的问题是:根据链接的q / a,我怎样才能有效地(就LOC而言)并轻松连接一个已准备好用于我的Spring JUnit代码中的Mockito间谍的DAO?
这是测试布局:
@RunWith(PhoenixJUnitTestRunner.class)
@ContextConfiguration //FolderManagerTests-context.xml is present
public class FolderManagerTests
{
@Autowired
private FoldersManager foldersManager;
//@Autowired
//private FoldersDao foldersDao; //coming soon, I want to spy this one
@Autowired
private SessionFactory sessionFactory;
@Test
public void testCache(){
List<Folder> foldersInDb = foldersManager.list(); //Expect cache miss
//TODO spy that DAO has been invoked
foldersInDb = foldersManager.list(); //Expect cache hit
//TODO spy that DAO has NOT been invoked
insertViaSessionFactory(); //Modifying the database manually
foldersInDb = foldersManager.list(); //Expect false-positive cache hit
//TODO spy that DAO has NOT been invoked
}
}
上下文文件FolderManagerTests-context.xml
包含在测试和生产中复制和粘贴的普通bean列表(读取,主要应用程序&#39; )上下文文件。
我的问题是:如何检查是否已调用@Autowired
DAO?
注意事项:我认为我必须确保注入管理器的DAO是Mockito存根。根据链接的答案,我可以从我的测试类中将DAO构建为@Bean
,但是这会通过复制和粘贴来轻松创建测试上下文。 我正在考虑实施一个BeanFactoryPostProcessor
,它将所有DAO包装在一个Mockito存根中。
修改
您还希望避免创建特定于测试的上下文,并且可能需要重新考虑此策略
我不同意这一点,但可能是因为过去一些糟糕的设计选择。谁最初编写了应用程序(并教会我维护它)从不关心自动化测试。在完整的Web应用程序启动时,手动完成测试。因此,如果连接单个组件,您可能会发现自己充斥着大量其他组件,这可能有其自身的问题,甚至无法在JUnit测试中启动上下文。并且一些组件(将来连接用于测试)需要像servlet上下文这样的web环境。
所以我认为我被迫创建测试专用的上下文来简化我的测试范围,选择要连接的组件和要模拟的组件。