【问题标题】:mocking an autowired object in a test在测试中模拟自动装配的对象
【发布时间】:2015-10-22 13:08:51
【问题描述】:

我有一个类,它有一个通过 spring bean 设置的字段,并使用 @Autowired 进行注释,如下所示:

public class Foo {
    ....
    @Autowired
    private Bar bar;
    .... 
}

我现在想设置一个 JUnit 测试来测试某些功能,这些功能在某些时候会创建一个 Foo 对象。我无法控制何时生成此 Foo 对象。模拟这个对象的最简单方法是什么,以便在 Foo 被实例化的任何时候,这个对象都会被模拟项填充?我正在使用第 3 方库很好地模拟 Bar 对象,因此我更愿意在 Java 测试类中完成所有这些操作,而不使用 xml 文件。

我在网上找到的所有内容似乎都涉及创建 xml 文件或模拟类的特定实例。谢谢大家的帮助!

我想要以下内容:

public class Test {
    private Bar mockedBar = createBar();
    // somehow set 'mockedBar' so that any Foo object
    // created always contains mockedBar 
}

【问题讨论】:

  • 该问题中提供的答案需要我创建一个 Foo 对象才能使用 spy 注释。除非,通过创建 Foo 对象并使用 spy 允许 Foo 的任何实例化将 Bar 设置为 'mockedBar'
  • 如果有一些功能会创建 Foo 对象,那么 Foo 对象不是 Spring 托管的 bean。你在实际应用中是如何设置 bar 的?
  • 通过 applicationContext.xml。我可以创建一个包含信息的特定于测试的 applicationContext 文件,但是我想模拟的对象可以通过第 3 方 java 调用 createBar() 轻松创建。所以,如果可能的话,我宁愿使用它。

标签: java spring unit-testing mocking autowired


【解决方案1】:

我在 JMOCKIT 的帮助下编写了 uch 测试,

请阅读它可能对你有帮助。

您只需要创建具有覆盖所需方法的对象。

然后使用

  Deencapsulation.setfield(FIXTURE,new Bar(){

    //@Override you methods

});

FIXTURE 是您希望 Bar 实例可在其中使用模拟方法的对象。

【讨论】:

    【解决方案2】:

    使用 JMockit 模拟库,您可以在测试类中简单地将模拟字段声明为 @Capturing Bar anyBar。这应该会导致任何当前或未来的 Bar 实例被模拟,即使它们属于 Bar 的某个子类。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-23
      相关资源
      最近更新 更多