khmarbaise
khmarbaise

Reputation: 97348

ApplicationContext Exception in Test with @WebMvcTest

I Have an Spring Boot Application (1.5.10.RELEASE) which contains a main (SpringBootApplication) like this:

@SpringBootApplication
@Configuration
@EntityScan(basePackages = { "db.modell", "db.modell.base" })
@ComponentScan(basePackages = { "de.gui.test" })
public class SpringBootConsoleApplication {
   public static void main(String[] args) throws Exception {
    SpringApplication.run(SpringBootConsoleApplication.class, args);
  }
}

and two REST controllers like the following:

@RestController
@RequestMapping("/as")
public class AController {
  @Autowired
  private ARepository aRepository;

  @RequestMapping(method = RequestMethod.GET)
  public ResponseEntity<Collection<A>> getAs() {
    return new ResponseEntity<>(orgtFarbeRepository.findAll(), HttpStatus.OK);
  }

  @RequestMapping(value = "/{id}", method = RequestMethod.GET)
  public ResponseEntity<A> getA(@PathVariable long id) {
    A a = ARepository.findOne(id);

    if (party != null) {
      return new ResponseEntity<>(ARepository.findOne(id), HttpStatus.OK);
    } else {
      return new ResponseEntity<>(null, HttpStatus.NOT_FOUND);
    }
  }
}

Furthermore I have a single test like this:

@RunWith(SpringRunner.class)
@WebMvcTest(AController.class)
public class AControllerTest {

  @Autowired
  private MockMvc mvc;

  @MockBean
  private ARepository ARepository;

  @Test
  public void firstTest() throws Exception {
    A a = new aFarbe();
    a.set....
    when(ARepository.findAll()).thenReturn(Collections.singleton(a));
    mvc.perform(
            get("/as")
            .accept(MediaType.APPLICATION_JSON_UTF8_VALUE)
    )
      .andExpect(status().isOk());
  }
}

The repositories look like this:

public interface ARepository extends CrudRepository<A, Long>
{
    Collection<A> findAll();
}
public interface BRepository extends CrudRepository<B, Long>
{
  Collection<B> findAll();
}

A and B them self are JPA annotated classes. The whole application contains access to a database..

Furthermore I have a Service like this:

@Service
public class XService {
  private static final Logger LOGGER = LoggerFactory.getLogger(XService.class);

  @Autowired
  private ARepository aRepository;

  @Autowired
  private BRepository bRepository;
...
}

The XService is not used via @Autowire or so (Just need to remove that):

So I try to run the AControllerTest I get the following error:

java.lang.IllegalStateException: Failed to load ApplicationContext at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124) .. .. at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'XService': Unsatisfied dependency expressed through field 'BRepository'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'BRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} .. .. at org.springframework.boot.test.context.SpringBootContextLoader.loadContext(SpringBootContextLoader.java:120) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:98) at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:116) ... 26 more Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'BRepository' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1493) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1104) at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066) at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585) ... 44 more

My assumption is that during the test more context is started than it should. The question is how can I prevent that? Which means only to start the context for the AControler and nothing more? I thought that based on the @WebMvcTest(AController.class) it should be limited already which looks like that it was not the case...

Upvotes: 2

Views: 5090

Answers (1)

khmarbaise
khmarbaise

Reputation: 97348

The referenced answer does not really answered my question but a in the context a hint gave me the solution. This means in consequence to add the following to my test:

so I have to add @OverrideAutoConfiguration(enabled=true):

@RunWith(SpringRunner.class)
@WebMvcTest(OrgtFarbenController.class)
@OverrideAutoConfiguration(enabled=true)
public class AControllerTest {
...
}

Upvotes: 7

Related Questions