【发布时间】:2014-10-03 13:15:36
【问题描述】:
我有一个使用@PostConstruct 缓存一些对象的类。
@Component
public class A {
@Autowired
private B b;
private X x;
@PostConstruct
public void init(){
x = b.doSomething()
}
}
public class C {
@Autowired
private A;
}
public class TestClass {
@Autowired
private A;
@Before
public init() {
expect(b.dosomething()).andReturns(x);
}
@Test
public test1() {
//test
}
}
我嘲笑了 B,因为它通过 HTTP 调用来获取 x。但是在通过单元测试运行时,我收到以下错误:
Missing behaviour definition for the preceding method call:
B.dosomething().andXXX()
如果我在 A 类的一些普通方法中做同样的事情,一切都很好。我正在使用 spring 进行依赖注入。
我认为这种行为的原因是,因为我在我的单元测试中对类 B 的模拟设置了期望,该模拟在调用这个 init 方法之后被调用。我该如何测试?
【问题讨论】:
-
向我们展示您的代码。我们无法解释为什么没有看到代码就无法工作。
-
我想我能感觉到问题将是什么,但是您是否可以提供您的测试类和测试上下文,以便我们可以看到发生问题的代码?
-
查看测试上下文也会有所帮助,但最终您的问题是您没有将 B 的实例注入您的测试类。如果没有对注入到 A 对象中的 B 的实际实例的引用,您将无法对其设置期望。 (请记住,Spring 上下文中的对象是单例。)一旦您在测试类中获得了引用,您可能会遇到您正在考虑的问题。我建议您在静态方法中创建您的模拟 B 实例,该方法设置期望并将模拟置于重放模式。
标签: java spring unit-testing easymock