Soy nuevo en marcos (acaba de pasar la clase) y esta es mi primera vez usando la Primavera de Arranque.

Estoy tratando de ejecutar una simple prueba de Junit para ver si mi CrudRepositories están de hecho trabajando.

El error que me sale es:

Incapaz de encontrar un @SpringBootConfiguration, usted necesita usar @ContextConfiguration o @SpringBootTest(clases=…) con la prueba de
java.lang.IllegalStateException

No Resorte de Arranque de configurar por sí misma?

Mi Clase De Prueba:

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

@Autowired
private AccountRepository repository;

@After
public void clearDb(){
    repository.deleteAll();
}

 @Test
 public void createAccount(){
     long id = 12;
     Account u = new Account(id,"Tim Viz");
     repository.save(u);

     assertEquals(repository.findOne(id),u);

 }


 @Test
 public void findAccountByUsername(){
     long id = 12;
     String username = "Tim Viz";
     Account u = new Account(id,username);
     repository.save(u);

     assertEquals(repository.findByUsername(username),u);

 }

Mi Primavera de aplicación de Arranque motor de arranque:

@SpringBootApplication
@EnableJpaRepositories(basePackages = {"domain.repositories"})
@ComponentScan(basePackages = {"controllers","domain"})
@EnableWebMvc
@PropertySources(value    {@PropertySource("classpath:application.properties")})
    @EntityScan(basePackages={"domain"})
    public class Application extends SpringBootServletInitializer {
        public static void main(String[] args) {
            ApplicationContext ctx = SpringApplication.run(Application.class, args);         

        }
    }

Mi Repositorio:

public interface AccountRepository extends CrudRepository<Account,Long> {

    public Account findByUsername(String username);

    }
}

10 Comentarios

  1. 236

    De hecho, la Primavera de Arranque no se fijó hasta por la mayor parte. Usted probablemente ya deshacerse de un montón de código que has publicado, especialmente en Application.

    Me gustaría que lo había incluido los nombres de los paquetes de todas las clases, o al menos, para los Application y JpaTest. La cosa acerca de @DataJpaTest y algunas otras anotaciones es que se busque un @SpringBootConfiguration anotación en el paquete actual, y si no encuentra lo que busca, que atraviesan el paquete de la jerarquía hasta que la encuentra.

    Por ejemplo, si el nombre completo de su clase de prueba fue com.example.test.JpaTest y para su aplicación se com.example.Application, luego de su clase de prueba será capaz de encontrar el @SpringBootApplication (y en ella, el @SpringBootConfiguration).

    Si la aplicación residido en una rama diferente del paquete de jerarquía, sin embargo, como com.example.application.Application, sería no encontrar.

    Ejemplo

    Considerar el siguiente proyecto de Maven:

    my-test-project
      +--pom.xml
      +--src
        +--main
          +--com
            +--example
              +--Application.java
        +--test
          +--com
            +--example
              +--test
                +--JpaTest.java

    Y, a continuación, el siguiente contenido en Application.java:

    package com.example;
    
    @SpringBootApplication
    public class Application {
    
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }

    Seguido por el contenido de JpaTest.java:

    package com.example.test;
    
    @RunWith(SpringRunner.class)
    @DataJpaTest
    public class JpaTest {
    
        @Test
        public void testDummy() {
        }
    }

    Todo debería funcionar. Si crea una nueva carpeta dentro de src/main/com/example llamado app y, a continuación, poner su Application.java dentro de él (y de actualización de la package declaración dentro del archivo), la ejecución de la prueba se le dará el siguiente error:

    java.lang.IllegalStateException: no se puede encontrar un @SpringBootConfiguration, usted necesita usar @ContextConfiguration o @SpringBootTest(clases=…) con la prueba de

    • Saludos, gracias por ofrecer una solución Estoy usando Maven paquete de instalación , con un paquete diferente para las pruebas y el código de la aplicación. Si interpreto bien lo de la u están diciendo es , Que tengo que dirigir mi Paquete de Prueba para la clase de la Aplicación? y, a continuación, encontrará el SpringConfiguration?
    • Si por «maven paquete» que significa «módulo», entonces sí, el módulo en el que tu clase de prueba se tiene que dependen del módulo que Application es en. Si, sin embargo, la media de src/main y src/test, a continuación, las carpetas no son parte del paquete de jerarquía. Tal vez es mejor que sólo la actualización de su pregunta con una captura de pantalla o una explicación de lo que su estructura de proyecto es como.
    • Acabo de resolver el problema como usted dijo. después de buscar un poco en google me encontré con la propuesta de la primavera estructura de paquetes y refactorizar todos ellos. Ahora las pruebas se ejecuta como se esperaba. Gracias mucho
    • Bien, es bueno saberlo! He actualizado la respuesta con un más completo ejemplo de todos modos.
    • +–test +com –+–ejemplo +–JpaTest.java también trabajo
    • Lo que la estructura del proyecto, ¿usas? De lo que he encontrado es que la estructura predeterminada es src/main/java y src/test/java
    • en mi caso el mismo error se produce como esta pregunta cuando trato de escribir pruebas para servicio de la capa, y he estructura como softwareengineering.stackexchange.com/a/323746/214216 por favor Puede sugerir la forma de escribir de la unidad de las pruebas de esta estructura? Muchas gracias.
    • Me temo que es demasiado poco para ir, y yo probablemente no habría sido capaz de dar una adecuada respuesta aquí en el campo de comentario de todos modos. Te sugiero publicar una nueva pregunta donde se nos muestra la estructura del proyecto, lo que estamos tratando de lograr, y el mensaje de error exacto que usted está consiguiendo. Gracias!

  2. 88

    De configuración se adjunta a la clase de aplicación, por lo que el siguiente será configurar todo correctamente:

    @SpringBootTest(classes = Application.class)

    Ejemplo de la JHipster proyecto aquí.

  3. 19

    Merece la pena comprobar si ha refactorizado nombre del paquete de la clase principal anotado con @SpringBootApplication. En ese caso, la prueba debe realizarse en un paquete adecuado de lo contrario será buscando en el paquete más antiguo . este fue el caso para mí.

  4. 8

    Además de lo que Thomas Kåsene dijo, también puede agregar

    @SpringBootTest(classes=com.package.path.class)

    a la prueba de anotación para especificar dónde debe buscar para la otra clase si no quieren reestructurar la jerarquía de archivos. Esto es lo que el mensaje de error sugiere diciendo:

    Unable to find a @SpringBootConfiguration, you need to use 
    @ContextConfiguration or @SpringBootTest(classes=...) ...
  5. 3

    En mi caso los paquetes fueron diferentes entre la Aplicación y las clases de Prueba

    package com.example.abc;
    ...
    @SpringBootApplication
    public class ProducerApplication {

    y

    package com.example.abc_etc;
    ...
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ProducerApplicationTest {

    Después de hacer de ellos de acuerdo a las pruebas se ejecutó correctamente.

  6. 3

    Trabajo fo me

    el nombre del paquete de la anterior clase de prueba es cambiado a la misma como el nombre del paquete de la clase normal.

    Incapaz de encontrar un @SpringBootConfiguration cuando se realiza una JpaTest

    cambio a esta

    Incapaz de encontrar un @SpringBootConfiguration cuando se realiza una JpaTest

  7. 2

    La prueba rebanada siempre en la Primavera de Arranque 1.4 trajo característica orientado a la prueba de capacidades.

    Por ejemplo,

    @JsonTest proporciona una sencilla Jackson entorno para probar el json de serialización y deserialización.

    @WebMvcTest proporciona un simulacro de entorno web, puede especificar la clase de controlador para probar e inyectar el MockMvc en la prueba.

    @WebMvcTest(PostController.class)
    public class PostControllerMvcTest{
    
        @Inject MockMvc mockMvc;
    
    }

    @DataJpaTest elaborará una base de datos incrustada y aporta JPA medio ambiente para la prueba.

    @RestClientTest proporciona RESTO entorno de cliente para la prueba, esp la RestTemplateBuilder etc.

    Estas anotaciones no están compuestas con SpringBootTest, se combinan con una serie de AutoconfigureXXX y un @TypeExcludesFilter anotaciones.

    Echar un vistazo a @DataJpaTest.

    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    @BootstrapWith(SpringBootTestContextBootstrapper.class)
    @OverrideAutoConfiguration(enabled = false)
    @TypeExcludeFilters(DataJpaTypeExcludeFilter.class)
    @Transactional
    @AutoConfigureCache
    @AutoConfigureDataJpa
    @AutoConfigureTestDatabase
    @AutoConfigureTestEntityManager
    @ImportAutoConfiguration
    public @interface DataJpaTest {}

    Usted puede añadir su @AutoconfigureXXX anotación para anular la configuración por defecto.

    @AutoConfigureTestDatabase(replace=NONE)
    @DataJpaTest
    public class TestClass{
    }

    Vamos a echar un vistazo a su problema,

    1. No mezclar @DataJpaTest y @SpringBootTest, como se dijo anteriormente @DataJpaTest va a construir la configuración en su propia manera(por ejemplo. de forma predeterminada, se va a tratar de preparar un H2 embebida en lugar de la aplicación de configuración de la herencia. @DataJpaTest es designado para prueba rebanada.
    2. Si desea personalizar la configuración de @DataJpaTest, por favor, lea esta entrada oficial en el blog a partir de la Primavera.io para este tema,(un poco pesado).
    3. Dividir las configuraciones en Application en pequeñas configuraciones de características, tales como WebConfig, DataJpaConfig etc. Un completa de la configuración de(mixto web, datos, seguridad, etc) también causó su prueba rebanada a base de pruebas para ser fallado. Compruebe la las muestras de la prueba en mi muestra.
  8. 1

    Creo que la mejor solución para este problema es alinear los tests de la estructura de carpetas con la aplicación de la estructura de la carpeta.

    Yo tenía el mismo problema que fue causada por la duplicación de mi proyecto a partir de una diferente estructura de carpetas del proyecto.

    si su proyecto de prueba y su proyecto de aplicación tendrá la misma estructura que no será necesario añadir ningún anotaciones especiales para las pruebas de las clases y todo funcionará como es.

    • Yo tenía el mismo error y finalmente comprendí que el nombre del paquete para la clase de prueba había un error tipográfico «regla» en lugar de «reglas». Después de corregir el nombre del paquete, el error se fue.
  9. 0

    Cuando todas las clases eran en el mismo paquete, las clases de prueba estaban trabajando. Tan pronto como he movido todas las clases de java para diferentes paquetes de mantener una adecuada estructura de proyecto que estaba el mismo error.

    He resuelto con mi principal nombre de la clase en la clase de prueba, como el de abajo.

    @SpringBootTest(classes=JunitBasicsApplication.class)

    Espero que esto ayude.!!

  10. -1
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
    import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureWebMvc;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    
    
    @RunWith(SpringRunner.class)
    @DataJpaTest
    @SpringBootTest
    @AutoConfigureWebMvc
    public class RepoTest {
    
        @Autowired
        private ThingShiftDetailsRepository thingShiftDetailsRepo;
    
        @Test
        public void findThingShiftDetails() {
                ShiftDetails details = new ShiftDetails();
                details.setThingId(1);
    
                thingShiftDetailsRepo.save(details);
    
                ShiftDetails dbDetails = thingShiftDetailsRepo.findByThingId(1);
                System.out.println(dbDetails);
        }
    }

    Por encima de anotaciones funcionado bien para mí. Estoy usando la primavera de arranque con JPA.

Dejar respuesta

Please enter your comment!
Please enter your name here