Reputation: 3471
This is my simplified code:
@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
}
}
My problem is that I need to stub MyBean
methods, before any other class which has this object autowired will run @BeforeClass
method. Right now @Before
method is executed after @PostConstruct
of any class which is autowiring this bean (there's more than one).
MyBean is autowired as a mock, but method is not stubbed, so I get: "SmartNull returned by this unstubbed method call on a mock:"
Is there any way to set priority of mocked bean in Spring container initialization ?
Upvotes: 8
Views: 4550
Reputation: 1147
Using @TestConfiguration
rather than using the @MockBean
might help to solve this problem.
@TestConfiguration
static class Configuration {
@Bean
public BeanToMock name() {
// return mock object
}
}
And annotating the test class with @ContextConfiguration
:
@ContextConfiguration(classes = TestClassName.Configuration.class)
Upvotes: 15
Reputation: 26066
Maybe not the most elegant workaround, but you can mock the behavior within a static block. Code in static block is executed before both @Before
and @PostConstruct
. I don't think, that mocking using annotations (@MockBean
) would work, but it can also be done programatically.
Upvotes: 2