Este es mi código simplificado:
@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 } } Mi problema es que necesito agregar métodos MyBean , antes de que cualquier otra clase que tenga este objeto autoconectado ejecute el método @BeforeClass . En este momento, el método @Before se ejecuta después de @PostConstruct de cualquier clase que esté autoconectando este bean (hay más de uno).
MyBean está autoconectado como un simulacro, pero el método no está bloqueado, por lo que obtengo: "SmartNull devuelto por esta llamada al método no bloqueado en un simulacro:"
¿Hay alguna forma de establecer la prioridad del frijol simulado en la inicialización del contenedor Spring?
Usar @TestConfiguration en lugar de usar @MockBean podría ayudar a resolver este problema.
@TestConfiguration static class Configuration { @Bean public BeanToMock name() { // return mock object } } Y anotando la clase de prueba con @ContextConfiguration :
@ContextConfiguration(classes = TestClassName.Configuration.class)Tal vez no sea la solución más elegante, pero puede simular el comportamiento dentro de un bloque estático. El código en el bloque estático se ejecuta antes que @Before y @PostConstruct . No creo que la burla usando anotaciones ( @MockBean ) funcione, pero también se puede hacer mediante programación.