Не удалось найти @ SpringBootConfiguration при выполнении JpaTest


Я новичок в фреймворках (только что прошел класс), и это мой первый раз с помощью springboot.

Я пытаюсь запустить простой тест Junit, чтобы увидеть, если мои CrudRepositories действительно работают.

ошибка, которую я продолжаю получать:

не удается найти @SpringBootConfiguration, необходимо использовать @ContextConfiguration или @SpringBootTest (classes=...) с вашим тестом Ява.ленг.IllegalStateException

не пружинная загрузка настроить себя?

Мой Тестовый Класс

@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);

 }

мой стартер приложения Spring boot

@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);         

        }
    }

Мой Репозиторий

public interface AccountRepository extends CrudRepository<Account,Long> {

    public Account findByUsername(String username);

    }
}

спасибо заранее

5 94

5 ответов:

действительно, Spring Boot по большей части настраивается. Вероятно, вы уже можете избавиться от большого количества кода, который вы опубликовали, особенно в Application.

Я хотел бы, чтобы вы включили имена пакетов всех ваших классов или, по крайней мере, для Application и JpaTest. Дело в том, что @DataJpaTest и несколько других аннотаций заключается в том, что они ищут @SpringBootConfiguration аннотация в текущем пакете, и если они не могут найти его там, они пересекают иерархию пакетов, пока не найдут оно.

например, если полное имя тестового класса com.example.test.JpaTest и один для вашего приложения com.example.Application, тогда ваш тестовый класс сможет найти @SpringBootApplication@SpringBootConfiguration).

если приложение находится в другой ветви иерархии пакетов, однако, как com.example.application.Application, это было не найти его.

пример

рассмотрим следующие Maven проект:

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

и затем следующее содержание в Application.java:

package com.example;

@SpringBootApplication
public class Application {

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

с последующим содержанием JpaTest.java:

package com.example.test;

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

    @Test
    public void testDummy() {
    }
}

все должно работать. Если вы создадите новую папку внутри src/main/com/example под названием app, а потом Application.java внутри него (и обновить package объявление внутри файла), запуск теста даст вам следующую ошибку:

java.ленг.IllegalStateException: не удается найти @SpringBootConfiguration, вам нужно использовать @ContextConfiguration или @SpringBootTest (classes=...) с вашим тестом

конфигурация прикреплена к классу приложения, поэтому все будет настроено правильно:

@SpringBootTest(classes = Application.class)

пример из проекта JHipster здесь.

стоит проверить, если вы рефакторинг имя пакета вашего главного класса с аннотацией @SpringBootApplication. В этом случае testcase должен быть в соответствующем пакете, иначе он будет искать его в более старом пакете . это был случай для меня.

в дополнение к тому, что сказал Томас Косене, вы также можете добавить

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

в аннотации теста указать, где он должен искать другой класс, если вы не хотите рефакторинг иерархии файлов. Вот на что намекает сообщение об ошибке, говоря:

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

The тестовый фрагмент при условии, что весной загрузки 1.4 принес характеристика ориентированные возможности теста.

например,

@JsonTest предоставляет простую среду Джексона для тестирования сериализации и десериализации json.

@WebMvcTest обеспечивает макет веб-среды, он может указать класс контроллера для тестирования и ввести MockMvc в тест.

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

@DataJpaTest подготовит встроенную базу данных и предоставляет базовую среду JPA для теста.

@RestClientTest обеспечивает среду клиента REST для теста, esp RestTemplateBuilder и т. д.

эти аннотации не составлены с SpringBootTest, они объединены с серией AutoconfigureXXX и @TypeExcludesFilter Примечание.

посмотреть @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 {}

вы можете добавить аннотацию @AutoconfigureXXX, чтобы переопределить конфигурацию по умолчанию.

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

давайте посмотрим на вашу проблему,

  1. не смешивайте @DataJpaTest и @SpringBootTest, как сказано выше @DataJpaTest будут строить конфигурацию по-своему(например. по умолчанию он попытается подготовить встроенный H2 вместо этого) из наследования конфигурации приложения. @DataJpaTest предназначен для