Tengo un método en un servicio que quiero probar y que usa MongoTemplate de la siguiente manera:
@Service public class MongoUpdateUtilityImpl implements MongoUpdateUtility { private final MongoTemplate mongoTemplate; @Autowired MongoUpdateUtilityImpl (final MongoTemplate mongoTemplate) { this.mongoTemplate = mongoTemplate; } @Override public Object update(final String id, final Map<String, Object> fields, final Class<?> classType) { ... this.mongoTemplate.updateFirst(query, update, classType); return this.mongoTemplate.findById(id, classType); } }Luego estoy tratando de probar este método con métodos simulados para la plantilla de mongo:
@SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) @ActiveProfiles("test") public class MongoUpdateUtilityTest { @MockBean private MongoTemplate mongoTemplate; @Autowired private MongoUpdateUtility mongoUpdateUtility; /** * Test en el que se realiza una actualización correctamente. */ @Test public void updateOK1() { final Map<String, Object> map = new HashMap<>(); map.put("test", null); map.put("test2", "value"); when(mongoTemplate.updateFirst(Mockito.any(Query.class), Mockito.any(Update.class), Mockito.any(Class.class))) .thenReturn(null); when(mongoTemplate.findById(Mockito.anyString(), Mockito.any(Class.class))).thenReturn(null); assertNull(this.mongoUpdateUtility.update("2", map, Map.class)); } }He leído esta pregunta, pero cuando pruebo la respuesta marcada como solución, dice que MongoTemplate no se puede inicializar. Preferiría burlarme de esto que usar una base de datos integrada, ya que estoy limitado en las bibliotecas que puedo usar.
Mi error:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'operacionesPendientesRepository' defined in es.santander.gdopen.operpdtes.repository.OperacionesPendientesRepository defined in @EnableMongoRepositories declared on MongoRepositoriesRegistrar.EnableMongoRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.NullPointerExceptionEstá utilizando @SpringBootTest, que muestra todo el contexto de la aplicación. Esto significa que se inicializarán todos los beans definidos en su aplicación.
Esta es una exageración para una prueba de un @Service:
Para una prueba de un @Service, le aconsejo que adopte un enfoque más simple y pruebe el servicio de forma aislada.