Test java.lang.IllegalStateException: Failed to load ApplicationContext

19,337

Remove class=ApplicationTest.class because of this your @SpringBootTest doesn't scan for other @Configuration classes

The component classes to use for loading an ApplicationContext. Can also be specified using @ContextConfiguration(classes=...). If no explicit classes are defined the test will look for nested @Configuration classes, before falling back to a @SpringBootConfiguration search.

Share:
19,337
Asel
Author by

Asel

Updated on June 04, 2022

Comments

  • Asel
    Asel almost 2 years

    I try to write a simple tests for my project(it is my first test, so don't judge me harshly), but my test failed and I get an error:

    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.test.context.support.DependencyInjectionTestExecutionListener.injectDependencies(DependencyInjectionTestExecutionListener.java:118)
        at org.springframework.test.context.support.DependencyInjectionTestExecutionListener.prepareTestInstance(DependencyInjectionTestExecutionListener.java:83)
        at org.springframework.boot.test.autoconfigure.SpringBootDependencyInjectionTestExecutionListener.prepareTestInstance(SpringBootDependencyInjectionTestExecutionListener.java:43)
        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$4.run(ParentRunner.java:331)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:79)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:329)
        at org.junit.runners.ParentRunner.access$100(ParentRunner.java:66)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:293)
        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$3.evaluate(ParentRunner.java:306)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:413)
        at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:190)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
        at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)
        at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:230)
        at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:58)
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'productsRepository': Cannot create inner bean '(inner bean)#251f7d26' of type [org.springframework.orm.jpa.SharedEntityManagerCreator] while setting bean property 'entityManager'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#251f7d26': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' available
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:389)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveValueIfNecessary(BeanDefinitionValueResolver.java:134)
        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.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:126)
        at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContextInternal(DefaultCacheAwareContextLoaderDelegate.java:99)
        at org.springframework.test.context.cache.DefaultCacheAwareContextLoaderDelegate.loadContext(DefaultCacheAwareContextLoaderDelegate.java:124)
        ... 26 more
    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name '(inner bean)#251f7d26': Cannot resolve reference to bean 'entityManagerFactory' while setting constructor argument; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' 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.ConstructorResolver.resolveConstructorArguments(ConstructorResolver.java:691)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:508)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1338)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1177)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:557)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:517)
        at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:374)
        ... 44 more
    Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'entityManagerFactory' 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)
        ... 52 more
    
    
    

    Applicationtest.properties:

    spring.datasource.url=jdbc:mysql://localhost:3306/fruitshop?serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=password
    spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
    [email protected]@
    spring.main.web-application-type=none
    

    I write a tests for two controllers. My Tests:

    import com.Products.Products;
    import org.junit.Assert.*;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.boot.test.web.client.TestRestTemplate;
    import org.springframework.boot.web.server.LocalServerPort;
    import org.springframework.http.HttpEntity;
    import org.springframework.http.HttpHeaders;
    import org.springframework.http.HttpMethod;
    import org.springframework.http.ResponseEntity;
    import org.springframework.test.context.junit4.SpringRunner;
    import static org.junit.Assert.assertNotNull;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest(classes = ApplicationTest.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
    
    public class ProductsControllerTest {
    
        @Autowired
        private TestRestTemplate restTemplate;
    
        @Test
        public void addNewProduct() {
            Products product = new Products();
            product.setName("Orange");
            product.setPrice(121);
            ResponseEntity<Products> postResponse = restTemplate.postForEntity("/products/addProduct", product, Products.class);
            assertNotNull(postResponse);
            assertNotNull(postResponse.getBody());
        }
    
        @Test
        public void getAllProducts() {
            HttpHeaders httpHeaders = new HttpHeaders();
            HttpEntity<String> entity = new HttpEntity<String>(null, httpHeaders);
            ResponseEntity<String> response = restTemplate.exchange("/products/allProducts",
                    HttpMethod.GET, entity, String.class);
            assertNotNull(response.getBody());
        }
    }
    
    

    This is my controller I use mysql:

    package com.Products;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.http.ResponseEntity;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.*;
    
    @Controller
    @RequestMapping(path = "/products")
    public class ProductsController {
    
        @Autowired
        private ProductsRepository productsRepository;
    
        @RequestMapping(value = "/addProduct", method = RequestMethod.POST)
        public @ResponseBody String addNewProduct (@RequestParam (value = "name")  String NameOfFruit,
                                                   @RequestParam  (value = "price") int PriceOfProduct) {
            Products product = new Products();
            product.setName(NameOfFruit);
            product.setPrice(PriceOfProduct);
    
            productsRepository.save(product);
            return "Done";
        }
    
        @RequestMapping(value = "/allProducts", method = RequestMethod.GET)
        public @ResponseBody Iterable<Products> getAllProducts() {
            return productsRepository.findAll();
        }
    }
    
    

    pom.xml

    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>Week9</artifactId>
        <version>1.0-SNAPSHOT</version>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>8</source>
                        <target>8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-parent</artifactId>
            <version>2.2.4.RELEASE</version>
        </parent>
    
        <properties>
            <java.version>13</java.version>
            <spring.version>5.2.3.RELEASE</spring.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-core</artifactId>
                <version>5.4.12.Final</version>
            </dependency>
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>5.4.12.Final</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.2.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.13</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <plagins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plagins>
    
    </project>
    

    ApplicationTest:

    package com.Products;
    
    import org.junit.Test;
    import org.springframework.boot.test.context.SpringBootTest;
    
    @SpringBootTest
    public class ApplicationTest {
    }
    

    I don 't know what to do anymore. Please indicate what the problem is and how I can solve it

    Worked version: https://github.com/Asel06/Neobis-Tasks/tree/master/task-9/Week9

    • GeertPt
      GeertPt about 4 years
      Can you show your ApplicationTest as well? And indicate which version of Spring Boot you are using? EntityManagerFactory is a JPA interface. It's usually auto-configured by spring boot, but you're probably missing some annotation or something similar in ApplicationTest.
    • M. Deinum
      M. Deinum about 4 years
      1. Your dependencies are a mess, 2. delete ApplicationTest and just add a clean @SpringBootTest to your testclass.
    • Nonika
      Nonika about 4 years
      @Asel what do you use jetty,jboss,tomcat or what? also do you use jsp or what
    • Nonika
      Nonika about 4 years
      Because you have everything into your pom.xml
    • Nonika
      Nonika about 4 years
      Is there specific reason that you need embeded jetty enstead of tomcat?
    • Asel
      Asel about 4 years
      @Nonika No reason. It's just that when I was writing the test I started making mistakes and to fix them I started googling and doing everything that i met
    • Nonika
      Nonika about 4 years
      So embedded tomcat is ok for you?
    • Nonika
      Nonika about 4 years
      Also are you using jsp?
    • Asel
      Asel about 4 years
      @Nonika Tomcat is ok, for the test I need to connect to my database and test the api so if it is better to use other tools for this, so it's ok
    • Nonika
      Nonika about 4 years
      You should correct your pom.xml there are duplicated dependencies and lots of unneeded ones you can start from start.spring.io to generate correct project
    • Asel
      Asel about 4 years
      @Nonika I did all what i can and what is happened
    • Nonika
      Nonika about 4 years
      @Asel can you be more specific. what is your current situation
    • Asel
      Asel about 4 years
      @Nonika I made some changes (add .properties for test, you can see changes in my question ) and after this i have the error: ``` org.springframework.web.client.ResourceAccessException: I/O error on POST request for "localhost:8080/products/addProduct": Connection refused: connect; nested exception is java.net.ConnectException: Connection refused: connect``` How i can change the port ? Or fix this problem
    • Nonika
      Nonika about 4 years
      can you upload your project on github?
    • Asel
      Asel about 4 years
      @Nonika Yep Github
    • Nonika
      Nonika about 4 years
      @Asel I have added pullrequest
  • Asel
    Asel about 4 years
    You mean @ContextConfiguration(classes = ApplicationTest.class) If you mean this, it's doesn't work
  • Nonika
    Nonika about 4 years
    can you post your build.gradle or pom.xml?
  • Nonika
    Nonika about 4 years
    and post also ApplicationTest.class
  • Nonika
    Nonika about 4 years
    @Asel See pull request
  • Asel
    Asel about 4 years
    I adore you! Seriously.
  • Nonika
    Nonika about 4 years
    :-) :-) :-) :-)
  • hanbin615
    hanbin615 over 3 years
    @Asel what happened in the pull request?
  • Asel
    Asel over 3 years