【发布时间】:2020-11-05 09:06:18
【问题描述】:
我在 Spring Boot 项目中定义了一些 bean,BeanA:
@Component
public class BeanA {
public String getName() {
return "A";
}
}
和BeanB:
@Component
public class BeanB {
@Autowired
private BeanA beanA;
private String name;
@PostConstruct
public void init() {
this.name = beanA.getName();
}
public String getName() {
return this.name;
}
}
当我模拟 beanA.getName 时,它返回 null
@RunWith(SpringRunner.class)
@SpringBootTest(classes = { MockitoTestApplication.class })
public class BeanTest {
@Autowired
private BeanB beanB;
@MockBean
private BeanA beanA;
@Before
public void mock() {
MockitoAnnotations.initMocks(this);
Mockito.doReturn("mockA").when(beanA).getName();
}
@Test
public void testGetName() {
System.out.println(beanB.getName()); // return null here
}
}
我猜这里有一些 bean 加载优先级,根本原因是什么以及如何解决它?
【问题讨论】:
-
您的模拟行为在 bean 已经构建之后被注册,因此
getName已经被调用。重写你的getName来做return beanA.getName(),它会返回你想要的。同时删除MockitoAnntations.initMocksSpring Boot Test 支持为您处理的句柄。
标签: java spring-boot mockito