如何将具有某些行为定义的模拟 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
(所以没有 String
、int
和其他文字)。例如:
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/