java - 如何重新初始化我的 bean

标签 java unit-testing spring-mvc dependency-injection mockito

我的 applicationContext-test.xml 中有一个 bean,用于模拟外部搜索引擎。这样,当我运行测试时,每当我的应用程序代码引用此搜索引擎时,我就知道我正在使用我的模拟引擎而不是真实的引擎。

我面临的一个问题是我希望这个引擎在不同的场景中表现不同。例如,当我调用 getDocuments() 时,我通常希望它返回文档。但有时我希望它抛出异常以确保我的应用程序代码正确处理异常。

我可以通过在测试代码中引用 bean 并更改一些 stub 来实现此目的,但随后我必须将 stub 更改回原来的状态,以便我的其他测试也能通过。由于多种原因,这似乎是不好的做法,因此我正在寻找替代方案。

我考虑的一种替代方法是完全重新初始化 bean。该 bean 是使用静态工厂方法从 applicationContext-test.xml 初始化的。我想做的是:

  1. 引用我的测试代码中的 bean 来更改其一些 stub
  2. 使用这些新 stub 运行测试
  3. 在此测试结束时,使用 applicationContext-test.xml 中指定的静态工厂方法重新初始化 Bean

我尝试过这样的事情:

    ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(
            new String[] { "applicationContext-test.xml" });
    Factory factory = appContext.getBean(Factory.class);
    factory = EngineMocks.createMockEngineFactory();

但这并不能解决问题。此后运行的任何测试仍然会失败。看来我的新 factory 变量包含我想要的 Factory 并相应地表现,但是当该 bean 在其他地方引用时,getDocuments() 仍然抛出之前 stub 的异常。显然,我的重新初始化仅影响局部变量,而不影响 bean 本身。

有人可以告诉我如何实现我的目标吗?

更新

虽然我很欣赏有关如何编写更好的测试和更好的模拟的建议,但我的目标是重新初始化 bean。我相信学习如何做到这一点无论是否适合我的用例都是有值(value)的(我相信它确实适合我的用例,但我很难说服我的一些批评者)。

唯一能从我这里获得赞成票或绿色勾号的答案是那些建议我如何重新初始化我的 bean 的答案。

最佳答案

您应该定义需要结果的情况和需要异常的情况。应通过方法的输入参数来区分它们。否则就不是一个好的测试。因此,对于给定的一组参数,输出应该是可预测的。

关于java - 如何重新初始化我的 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371377/

相关文章:

java - Android Canvas 性能与其他设备非常不一致

unit-testing - 如何在 F# 代码库上执行突变测试?

java - @JsonTypeName 不起作用并在尝试解析子类型时返回 Missing type id

java - Spring框架请求范围和单例 Autowiring

java - 使用 'Reflect' 从扩展抽象类获取参数值

java - 使用 JFreeChart 创建包含数据库值的条形图

java - 异常处理错误: with Java?

C++ - Google 测试 - 如何并行运行不同目录中的所有测试?

swift - 如何使用全局结构进行单元测试?

java - Spring Boot 1.3.0.RELEASE 默认搜索位置导致 FilePermission 问题