如何将具有某些行为定义的模拟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?有没有更好的方法来解决这个问题?
答案 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);
- 注释方法中的第一个调用。
此外,您的@Before
和expected
参数错误。
答案 1 :(得分:1)
我假设如果你在A类中注入一个bean,那么它需要是单例。你想通过创建一个构造函数并将参数传递给它来实现什么?如果你想在创建bean后立即执行某些操作,那么我建议你用普通方法替换构造函数并在其上使用@PostConstruct
。例如:
@PostConstruct
public void init () {
/* Do Something */
}
如果你想利用像Mockito这样的测试框架充分发挥潜力,你需要调整一些东西。
告诉我,我是否误解了你的要求。