java - 将模拟bean注入(inject)到测试对象中

标签 java spring unit-testing mockito

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

例如,我想测试这个类:

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");
   }
}

我怎样才能真正将模拟注入(inject)到 A 中?有没有更好的方法来解决这个问题?

最佳答案

根据 documentation 被测对象的构造函数必须与测试中的模拟相匹配才能发生注入(inject)。 因此,您需要重新设计构造函数才能使其正常工作。 int 无法被模拟。

作为一般说明,您应该尝试保持 Spring beans 无状态,这意味着唯一允许的类变量是其他无状态 bean (所以没有 Stringint 和其他文字)。例如:

public class A {

   @Autowired 
   private B b;

   public String getResult(int c) {
      return b.calculateStuff(c) + "AAA";
   }
}

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

此外,您的预期实际参数的方式是错误的。

关于java - 将模拟bean注入(inject)到测试对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34999502/

相关文章:

java - 使用 StreamAPI 按多个字段查找总和、平均分组

java - TextView 在最后一行设置图像

java - 为什么@Autowired 按类连接?

reactjs - 在 componentDidMount 中获取时如何测试 react 组件?

javascript - 在 Windows 中查看 LCOV 文件

java - 尝试从 Android 应用程序将录制的视频上传到服务器时出现 FileNotFoundException

java - 如何在 android 模拟器 1.6 和 2.2 中测试字符串相同

spring - Spring session 管理和Spring安全 session 的区别?

java - 如何解决java中Set<Path>的Hibernate映射异常?

java - 如何模拟信息是否正确发送到另一台服务器?