如何将定义某些行为的模拟 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
(所以没有String
,int
,其他文字)。例如:
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这样的测试框架,你需要调整一些东西。
告诉我我是否误解了你的要求。