【问题标题】:Easy mock: Setting expectation inside @PostConstruct简单模拟:在@PostConstruct 中设置期望
【发布时间】: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


【解决方案1】:

如果您希望在 A 类的 @PostConstruct 注解的“init”方法中测试代码,您可以考虑在测试中不使用 Spring 进行测试。您将需要手动注入依赖项。

一种方法是:

import org.easymock.EasyMock;
import org.junit.Before;
import org.junit.Test;
import org.powermock.reflect.Whitebox;

public class TestA {

    private A a = new A();
    private B b = EasyMock.createMock(B.class);

    @Before
    public void init() {
        Whitebox.setInternalState(a, "b", b);
    }

    @Test
    public void testInit() {
        EasyMock.reset(b);
        //define mock behavior here
        EasyMock.replay(b);

        a.init();

        //assert and verify
        EasyMock.verify(b);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2023-03-14
    • 2023-04-08
    相关资源
    最近更新 更多