Easy mock:在@PostConstruct中设置期望值

时间:2014-08-10 16:54:01

标签: java spring unit-testing easymock

我有一个使用@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方法被调用。我该怎么测试呢?

1 个答案:

答案 0 :(得分:0)

如果您希望在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);
    }
}