Spring Boot test doesn't find bean from sibling package

springboottest
spring boot test junit 5
spring boot test autowired null
spring-boot-test-autoconfigure
spring-boot-starter-test
spring boot integration test example
spring boot test exclude configuration
spring boot test configuration properties

I have a @SpringBootTest annotated test class which wants to make use of a test utility:

package org.myproject.server;

// ...

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class ServerITest {

    private @Autowired TestHelperBean helper;

    // ...
}

This works fine if the TestHelperBean is defined in the same package as the test class (or in a sub-package).

package org.myproject.server;

import org.springframework.stereotype.Component;

@Component
public class TestHelperBean {
    // ...
}

If I move it to a sibling package though, the component is not found:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.myproject.testutils.TestHelperBean' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)}

I guess that component scanning by default only looks in the test class' package and sub-packages – but is there a way to override this default? I tried to add the @ComponentScan annotation to my test, but this didn't seem to have any effect:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
@ComponentScan("org.myproject")
public class ServerITest {
    // ...
}

Is there a way to use beans from sibling packages in Spring Boot tests?

Getting Started, Spring Test & Spring Boot Test — Utilities and integration test support for Spring NONE — Loads an ApplicationContext using SpringApplication but does not  The spring-boot-starter-test dependency contains everything we need to override the property value in the tests. 3. Setup. First, we'll have to create a class in the

With componentscan annotation you can specify '*' to cover all subpackages under base package as well.

@ComponentScan({"org.myproject.*", "org.newproj.*"})

It covers all subpackages under "org.myproject" and "org.newproj".

Example package structure

org.myproject 
org.myproject.abc 
org.myproject.abcd 
org.myproject.xyz.abc

org.newproj 
org.newproj.abc 
org.newproj.xyz

OR

Register bean with Configuration/SpringBootApplication class

@Bean
private TestHelperBean helper() {
    return new TestHelperBean();
}

41. Testing, Please note: The following article will be dedicated to testing Spring Boot is to get a User by their id so we're going to test if it does what it's supposed to. The spring-boot-starter-test is the primary dependency that contains the majority of elements required for our tests. The H2 DB is our in-memory database. It eliminates the need for configuring and starting an actual database for test purposes. 4.

In the component scan you can add multiple packages the need to be scanned

@ComponentScan({"org.myproject","org.myproject. server","org.myproject. sibilings"})

Integration Tests with @SpringBootTest, Learn about @SpringBootTest annotation provided by Spring boot to enable boot specific features in the tests during unit testing or integration testing. This way, Spring doesn’t fire up a whole application context each time the test is started. For tests that cover integration with the web layer or persistence layer, we can use @WebMvcTest or @DataJpaTest instead. For integration with other layers, have a look at Spring Boot’s other test slice annotations. Note that these test slices will

The other answers regarding the use of ComponentScan are correct. However, the Spring Boot documentation strongly advises that "your main application class be in a root package above other classes". From personal experience I can say that deviating from this practice will result in more trouble than it's worth.

Testing in Spring Boot, This testing tutorial will teach you how to write unit and integration tests for a Spring Boot app and introduce tools like Hamcrest to facilitate testing. MockMvc is the Spring class that does that. It can be set up in different ways:. You have 0 compile dependencies, only test-compile dependencies defined, because you've commented out spring-boot-starter-data-jpa. Spring starter's pull other dependencies in (including other starters) to create everything needed at compile time. Un-comment the spring-boot-starter-data-jpa dependency, and/or re-evaulate what dependencies you

How to Test a Spring Boot Application, Spring Boot provides a @SpringBootTest annotation, which can be [com/​logicbig/example/ShoppingCartTest-context.xml] does not exist By default, spring-boot-starter-test dependency imports the junit 4 dependencies into Spring boot application. To use Junit 5, we must exclude Junit 4 and include Junit 5 into project dependencies. We are using latest spring boot version (to date) i.e. 2.1.7.RELEASE .

Spring boot integration testing with @SpringBootTest , You can just mock the method that will connect to database in your repository class in the @Test method. @SpringBootTest  Test Coverage analysis (with JaCoCo and Sonar) for your Spring Boot app by Moisés Macero on February 6, 2016 One of the main metrics for a software project is Test Coverage: if done properly, it gives you a quick picture of how much code is protected by tests .

Unit and Integration Tests in Spring Boot, Spring-boot framework allows us to provide YAML files as a replacement for the .properties file and it is convenient.The keys in property files can be provided in YAML format in application.yml file in the resource folder and spring-boot will automatically take it up.Keep in mind that the yaml format has to keep the spaces correct for the value to be read correctly.

Comments
  • Check to make sure that TestHelperBean is annotated properly. It should not be a problem if that class is part of the same project.
  • The TestHelperBean is annotated with @Component - see updated question. This is correct AFAIK.
  • I tried this out, but it doesn't have any effect :(
  • I've also tried your second proposal, i.e. I've added the @Bean annotated method to the test class, but it doesn't work either :(
  • I tried this out with the appropriate package names, but it doesn't have any effect :-(
  • it included the package of the TestHelperBean