将mock bean注入测试对象

时间:2016-01-25 18:19:49

标签: java spring unit-testing mockito

如何将具有某些行为定义的模拟bean注入到正在测试的类中,但是当它被启动时,构造函数会调用mock并对其执行某些操作。

例如,我有这个课我想测试:

public class A {

   @Autowired 
   private B b;

   private String result = null;

   public A(int c) {
      result = b.calculateStuff(c) + "AA";
   } 

   public String getResult() {
      return result + "A";
   }
}

Now the test class:


public class ATest{

   @Mock
   private B b;

   @InjectMocks
   private A a;

   @Before
   public void setUp() {
      doReturn("String result!").when(B).get(anyInt());
      MockitoAnnotations.initMocks(this);
   }

   public void testGetResult() {
      assertEquals(a.getResult(),"String result!AAA");
   }
}

我怎样才能将模拟注入A?有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

根据documentation ,测试对象的构造函数必须匹配测试中的模拟以进行注入。因此,您需要重新设计构造函数才能使其正常工作。 int无法嘲笑。

作为一般说明,您应该尝试保留Spring beans stateless,这意味着唯一允许的类变量是其他stateless beans(所以没有String,{{ 1}},其他文字)。例如:

int

public class A { @Autowired private B b; public String getResult(int c) { return b.calculateStuff(c) + "AAA"; } } 应该是MockitoAnnotations.initMocks(this); - 注释方法中的第一个调用。

此外,您的@Beforeexpected参数错误。

答案 1 :(得分:1)

我假设如果你在A类中注入一个bean,那么它需要是单例。你想通过创建一个构造函数并将参数传递给它来实现什么?如果你想在创建bean后立即执行某些操作,那么我建议你用普通方法替换构造函数并在其上使用@PostConstruct。例如:

@PostConstruct
public void init () {
      /* Do Something */
   } 

如果你想利用像Mockito这样的测试框架充分发挥潜力,你需要调整一些东西。

告诉我,我是否误解了你的要求。