将模拟 bean 注入测试对象



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

例如,我有这个想要测试的类:

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 ?有没有更好的方法来解决这个问题?

根据文档,被测对象的构造函数必须与测试中的模拟匹配才能进行注入。因此,您需要重新设计构造函数才能正常工作。int不能被嘲笑。

作为一般说明,你应该尽量保持你的Spring beans stateless,这意味着唯一允许的类变量是其他stateless beans(所以没有Stringint,其他文字)。例如:

public class A {
   @Autowired 
   private B b;
   public String getResult(int c) {
      return b.calculateStuff(c) + "AAA";
   }
}

MockitoAnnotations.initMocks(this);应该是@Before注释方法中的第一个调用。

此外,你也有你的expected,并以错误的方式actual论点。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新