【发布时间】:2019-07-01 09:59:32
【问题描述】:
这是我的简化代码:
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MockitoSpringBootTest {
@MockBean
private MyBean myBean;
@Before
private void before(){
Mockito.when(myBean.getSomeString()).thenReturn("TEST"));
}
}
@Service
private class TestClass {
@Autowired
private MyBean myBean;
@PostConstruct
public void initialize() {
myBean.getSomeString(); //SmartNull - method is not stubbed yet
}
}
我的问题是我需要存根MyBean 方法,然后任何其他具有此对象自动装配的类将运行@BeforeClass 方法。现在@Before 方法在任何自动装配这个bean 的类的@PostConstruct 之后执行(不止一个)。
MyBean 作为模拟自动装配,但方法没有存根,所以我得到:“SmartNull 由这个未存根的方法调用模拟返回:”
有没有办法在 Spring 容器初始化中设置模拟 bean 的优先级?
【问题讨论】:
-
这是无效的语法。您不能注释初始化程序块。
@Before(){private MyBean myBean后面少了一个分号。("TEST"))行的末尾有一个额外的括号。请在发布之前运行您的代码。 -
当
@PostConstruct方法被调用时,myBean已经被自动绑定了,还是还是null呢? -
@isnot2bad 是的 - 它作为模拟自动装配,但方法尚未存根,因此返回智能 null
-
是否调用了 initMocks()?
-
符合预期。在执行测试方法之前初始化应用程序上下文,因此它将构造所有 bean。
@Before在测试方法被执行并且上下文已经被初始化之前被调用。像这样使用@MockBean时,您无法更改此设置。您可以创建一个专门的配置并手动模拟 bean 并直接注册您想要的行为,这是唯一的解决方法。
标签: java spring spring-boot kotlin mockito