lapots
lapots

Reputation: 13395

Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test

I am using Spring Data JPA and Spring Boot. The layout of the application is this

main
    +-- java
        +-- com/lapots/game/monolith
            +-- repository/relational
                +--RelationalPlayerRepository.java
            +-- web
                +--GrandJourneyMonolithApplication.java
                +-- config
                    +-- RelationalDBConfiguration.java
test
    +-- java
        +-- com/lapots/game/monolith
            +-- repository/relational
                +-- RelationalPlayerRepositoryTests.java
            +-- web
                +-- GrandJourneyMonolithApplicationTests.java

The repository for my object looks like this

public interface RelationalPlayerRepository extends JpaRepository<Player, Long> {
}

Additionally for the repositories I provided a configuration

@Configuration
@EnableJpaRepositories(basePackages = "com.lapots.game.monolith.repository.relational")
@EntityScan("com.lapots.game.monolith.domain")
public class RelationalDBConfiguration {
}

My main application looks like this

@SpringBootApplication
@ComponentScan("com.lapots.game.monolith")
public class GrandJourneyMonolithApplication {

    @Autowired
    private RelationalPlayerRepository relationalPlayerRepository;

    public static void main(String[] args) {
        SpringApplication.run(GrandJourneyMonolithApplication.class, args);
    }

    @Bean
    public CommandLineRunner initPlayers() {
        return (args) -> {
            Player p = new Player();
            p.setLevel(10);
            p.setName("Master1909");
            p.setClazz("warrior");

            relationalPlayerRepository.save(p);
        };
    }
}

Test for application looks like this

@RunWith(SpringRunner.class)
@SpringBootTest
public class GrandJourneyMonolithApplicationTests {

    @Test
    public void contextLoads() {
    }

}

The test for repository looks like this

@RunWith(SpringRunner.class)
@DataJpaTest
public class RelationalPlayerRepositoryTests {

    @Autowired
    private TestEntityManager entityManager;

    @Autowired
    private RelationalPlayerRepository repository;

    @Test
    public void testBasic() {
        Player expected = createPlayer("Master12", "warrior", 10);
        this.entityManager.persist(expected);
        List<Player> players = repository.findAll();
        assertThat(repository.findAll()).isNotEmpty();
        assertEquals(expected, players.get(0));
    }

    private Player createPlayer(String name, String clazz, int level) {
        Player p = new Player();
        p.setId(1L);
        p.setName(name);
        p.setClazz(clazz);
        p.setLevel(level);
        return p;
    }
}

But when I try to run the tests I get the error

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 0.041 sec <<< FAILURE! - in com.lapots.game.monolith.repository.relational.RelationalPlayerRepositoryTests
initializationError(com.lapots.game.monolith.repository.relational.RelationalPlayerRepositoryTests)  Time elapsed: 0.006 sec  <<< ERROR!
java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @ContextConfiguration or @SpringBootTest(classes=...) with your test
at org.springframework.util.Assert.state(Assert.java:70)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.getOrFindConfigurationClasses(SpringBootTestContextBootstrapper.java:202)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.processMergedContextConfiguration(SpringBootTestContextBootstrapper.java:137)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:409)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildDefaultMergedContextConfiguration(AbstractTestContextBootstrapper.java:323)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildMergedContextConfiguration(AbstractTestContextBootstrapper.java:277)
at org.springframework.test.context.support.AbstractTestContextBootstrapper.buildTestContext(AbstractTestContextBootstrapper.java:112)
at org.springframework.boot.test.context.SpringBootTestContextBootstrapper.buildTestContext(SpringBootTestContextBootstrapper.java:82)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:120)
at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:143)
at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)

What is the problem? Domain Player loooks like this

@Data
@Entity
@Table(schema = "app", name = "players")
public class Player {
    @Id
    @GeneratedValue
    private Long id;

    @Transient
    Set<Player> comrades;

    @Column(unique = true)
    private String name;

    private int level;

    @Column(name = "class")
    private String clazz;
}

Upvotes: 145

Views: 210408

Answers (12)

Amaan Ali Khan
Amaan Ali Khan

Reputation: 21

In my case

@ContextConfiguration
class Productrestapi2ApplicationTests {

    @Test
    void contextLoads() {
    }

}

Adding @ContextConfiguration helped

Upvotes: 0

Carl Bosch
Carl Bosch

Reputation: 1281

I had this problem when running the tests in Maven not in Eclipse. To solve the issue, I had to move the annotations from parent class to actual test child class

@ActiveProfiles("integrationtests")
@SpringBootConfiguration
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)

Upvotes: 0

Saurabh Parmar
Saurabh Parmar

Reputation: 3131

The packages src/test/java and src/main/java should match. I had the same issue where

  • The src/main/java packages were starting with com.comp.example but
  • The src/test/java packages were starting with com.sample.example

Because of this spring boot application was not able to pickup the configuration of the application, which it picks up from @SpringBootApplication class. So test case should fall under the same packages where @SpringBootApplication in src/main/java is written.

Upvotes: 313

Yuriy Tsarkov
Yuriy Tsarkov

Reputation: 2548

When Spring Boot starts, it scans the classpath from top to bottom of the project to find the config file. Your config is under another files and that is a reason of the problem. Move you config higher up to the monolith package and everything will be fine.

Upvotes: 40

cellepo
cellepo

Reputation: 4479

Although not a direct answer to the OP Question, I was able to solve my own experience of the same error message (as the Title of this Question) in IntelliJ IDEA:

Some part of the "Maven Dance"™️ {mvn clean compile, [IntelliJ] Reload All Maven Projects} solved it for me.

Upvotes: 0

Dhurba Ghimire
Dhurba Ghimire

Reputation: 31

For me it worked by adding the path to the main class as below

@SpringBootTest(classes = {com.ghimire.bookApi.SpringBookApiPracticeApplication.class})

Upvotes: 3

mumbasa
mumbasa

Reputation: 822

if your project has no testable code in it and you have the default test block in the spring boot default test class

@SpringBootTest

class DemoApplicationTests {
    @Test
    void contextLoads() {
    }
}

delete the test annotation and the the contextLoads() method. to this

@SpringBootTest
class DemoApplicationTests {
}

Upvotes: 5

Nava Polak Onik
Nava Polak Onik

Reputation: 1629

I was able to resolve this problem only after including in the @SpringBootTest classes both the context configuration class and the application class.

Upvotes: 0

Joel Mata
Joel Mata

Reputation: 514

In my case this was due to some [move|copy/paste] of classes. For some, the package clause was either [not updated correctly|not present] and the changes were not picked up but the IDE.

Anyways, review your project packaging.

Upvotes: 4

pankaj pundir
pankaj pundir

Reputation: 427

The Test src/test/java files should also follow the same directory structure as in src/main/java.

enter image description here

Upvotes: 18

pwipo
pwipo

Reputation: 543

Delete the file module-info.java. This worked for me.

Upvotes: 0

downeyt
downeyt

Reputation: 1306

@SpringBootTest has a parameter named classes. It accepts an array of classes for configuration. Add the class for the config file to it, for example:

@SpringBootTest(classes={com.lapots.game.monolith.web.GrandJourneyMonolithApplication.class})

Upvotes: 34

Related Questions