通过XML配置使用Mockito监视Spring Bean

时间:2018-04-10 13:21:29

标签: java spring unit-testing mockito

我遇到以下情况:我正在编写单元/集成测试代码,需要测试缓存一致性。我正在通过这项工作建立自己的测试自动化知识,所以我不能称自己为专家。

我有一个常规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环境。

所以我认为我被迫创建测试专用的上下文来简化我的测试范围,选择要连接的组件和要模拟的组件。

0 个答案:

没有答案