title: A Spring test requires several beans that no being used by the controller
body: <p>I have a test about a Spring (v2.2.2.RELEASE) controller which is failing because require some beans that the controller not need. Why this beans are required?</p>
  
  <p><strong>Controller</strong></p>
  
  <pre><code>@Api(description = "Exercises")
  @CrossOrigin(origins = ["*"])
  @RestController
  @RequestMapping("/api/exercises")
  class ExerciseController(
          val repo: ExerciseRepository,
          val userAuditing: UserAuditing
  ) : ResourceRestController&lt;Exercise, String&gt;(repo)  {
      @PostMapping("")
      override fun create(@RequestBody resource: Exercise): Mono&lt;ResponseEntity&lt;Exercise&gt;&gt; {
          // TODO Free Coaches members just can create public exercises!
          return super.create(resource)
      }
  }
  
  abstract class ResourceRestController&lt;T : Resource, ID&gt;(private val repository: ReactiveMongoRepository&lt;T, ID&gt;) {
     @PostMapping
     open fun create(@RequestBody resource: T) = repository.save(resource)
              .map { o -&gt; ResponseEntity(o, HttpStatus.CREATED) }
              .onErrorMap { err -&gt;
                  log.error("Error occurred while creating the resource", err);
                  HttpServerErrorException(HttpStatus.INTERNAL_SERVER_ERROR, "Error occurred while creating the resource")
     }
  }
  </code></pre>
  
  <p><strong>Controller dependencies</strong></p>
  
  <pre class="lang-kotlin prettyprint-override"><code>@Component
  class UserAuditing : ReactiveBeforeConvertCallback&lt;Resource&gt; {
  
      val log: Logger = LoggerFactory.getLogger(UserAuditing::class.java)
  
      override fun onBeforeConvert(entity: Resource, collection: String) = getCurrentUser()
              .flatMap{ user -&gt;
                  entity.lastModifiedBy = user
                  entity.lastModifiedDate = Instant.now(Clock.systemUTC())
  
                  if(entity.id == null) {
                      entity.createdBy = entity.lastModifiedBy
                      entity.createdDate = entity.lastModifiedDate
                  }
                  Mono.just(entity)
              }
  
      fun getCurrentUser() = ReactiveSecurityContextHolder.getContext()
              .map { ctx -&gt; ctx.authentication.principal }
              .cast(User::class.java)
              .map(User::getUsername)
  }
  
  interface ExerciseRepository : ReactiveMongoRepository&lt;Exercise,String&gt; {}
  </code></pre>
  
  <p><strong>Configuration</strong></p>
  
  <pre class="lang-kotlin prettyprint-override"><code>@EnableWebFluxSecurity
  @EnableReactiveMethodSecurity
  class SecurityConfig(
          val tokenProvider: JwtTokenProvider,
          val customUserDetailsService: CustomUserDetailsService
  ) { 
  }
  
  @EnableWebFlux
  @SpringBootApplication
  @EnableReactiveMongoRepositories
  class BackendApplication
  
  fun main(args: Array&lt;String&gt;) {
      runApplication&lt;BackendApplication&gt;(*args)
  }
  </code></pre>
  
  <p><strong>Test</strong></p>
  
  <pre class="lang-kotlin prettyprint-override"><code>@RunWith(SpringRunner::class)
  @WebFluxTest(ExerciseController::class)
  @Import(UserAuditing::class)
  class ExerciseControllerTest {
  
      @Autowired
      lateinit var webClient: WebTestClient
  
      @MockBean
      lateinit var exerciseRepository: ExerciseRepository
  
      @Test
      fun create() {
          webClient.post()
                  .uri("/")
                  .contentType(MediaType.APPLICATION_JSON)
                  .bodyValue("""
                      {
                        "ages": {
                          "start": 0,
                          "end": 0
                        },
                        "description": "Two queues of 5 players located in the bottom of the court. Every pla yer with a ball, ...",
                        "goals": [
                          "shoot"
                        ],
                        "id": "string",
                        "language": "es",
                        "length": 10,
                        "title": "Chickens, foxes and sneaks",
                        "visibility": "private"
                      }
                  """.trimIndent())
                  .exchange()
                  .expectStatus()
                  .is2xxSuccessful
      }
  }
  </code></pre>
  
  <p><strong>Result</strong></p>
  
  <pre><code>java.lang.IllegalStateException: Failed to load ApplicationContext
      at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:132)
      at org.springframework.test.context.support.DefaultTestContext.getApplicationContext(DefaultTestContext.java:123)
      at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.postProcessFields(MockitoTestExecutionListener.java:95)
      at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.injectFields(MockitoTestExecutionListener.java:79)
      at org.springframework.boot.test.mock.mockito.MockitoTestExecutionListener.prepareTestInstance(MockitoTestExecutionListener.java:54)
      at org.springframework.test.context.TestContextManager.prepareTestInstance(TestContextManager.java:244)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTest(SpringJUnit4ClassRunner.java:227)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner$1.runReflectiveCall(SpringJUnit4ClassRunner.java:289)
      at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.methodBlock(SpringJUnit4ClassRunner.java:291)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:246)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:97)
      at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
      at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
      at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
      at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
      at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
      at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
      at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
      at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
      at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
      at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.runTestClass(JUnitTestClassExecutor.java:110)
      at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:58)
      at org.gradle.api.internal.tasks.testing.junit.JUnitTestClassExecutor.execute(JUnitTestClassExecutor.java:38)
      at org.gradle.api.internal.tasks.testing.junit.AbstractJUnitTestClassProcessor.processTestClass(AbstractJUnitTestClassProcessor.java:62)
      at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:51)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
      at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
      at org.gradle.internal.dispatch.ContextClassLoaderDispatch.dispatch(ContextClassLoaderDispatch.java:33)
      at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:94)
      at com.sun.proxy.$Proxy2.processTestClass(Unknown Source)
      at org.gradle.api.internal.tasks.testing.worker.TestWorker.processTestClass(TestWorker.java:118)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
      at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.base/java.lang.reflect.Method.invoke(Method.java:566)
      at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:36)
      at org.gradle.internal.dispatch.ReflectionDispatch.dispatch(ReflectionDispatch.java:24)
      at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:182)
      at org.gradle.internal.remote.internal.hub.MessageHubBackedObjectConnection$DispatchWrapper.dispatch(MessageHubBackedObjectConnection.java:164)
      at org.gradle.internal.remote.internal.hub.MessageHub$Handler.run(MessageHub.java:412)
      at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
      at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
      at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
      at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
      at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56)
      at java.base/java.lang.Thread.run(Thread.java:825)
  Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'trainingRepository': Cannot resolve reference to bean 'reactiveMongoTemplate' while setting bean property 'reactiveMongoOperations'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'reactiveMongoTemplate' available
      at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:342)
      at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:113)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1699)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1444)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)
      at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
      at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:323)
      at org.springframework.beans.factory.support.AbstractBeanFactory$$Lambda$281.000000007B795E90.getObject(Unknown Source)
      at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:321)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:860)
      at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:878)
      at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550)
      at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:747)
      at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
      at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
      at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:125)
      at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
      at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
      ... 50 more
  Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'reactiveMongoTemplate' available
      at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:805)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1278)
      at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:297)
      at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
      at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:330)
      ... 69 more
  </code></pre>
  
  <p>Why I need mocking trainingRepository if it is not used in the ExerciseController?</p>