it-swarm.com.ru

Невозможно найти @SpringBootConfiguration при выполнении JpaTest

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

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

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

Не удалось найти @SpringBootConfiguration, вам нужно использовать @ContextConfiguration или @SpringBootTest (classes = ...) с вашим тестом java.lang.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);

 }

My Spring, стартер загрузочного приложения

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

    }
}

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

115
Thomas Billet

Действительно, 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.lang.IllegalStateException: невозможно найти @SpringBootConfiguration, необходимо использовать @ContextConfiguration или @SpringBootTest (classes = ...) с вашим тестом

181
Thomas Kåsene

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

@SpringBootTest(classes = Application.class)

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

58
mrts

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

13
Mohammed Rafeeq

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

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

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

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

Test slice, предоставляемый в Spring Boot 1.4, предоставил возможности тестирования, ориентированные на feature

Например, 

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

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

@WebMvcTest(PostController.class)
public class PostControllerMvcTest{

    @Inject MockMvc mockMvc;

}

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

@RestClientTest предоставляет REST клиентскую среду для теста, особенно 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 предназначен для test slice.
  2. Если вы хотите настроить конфигурацию @DataJpaTest, прочитайте эту официальную запись в блоге из Spring.io для этой темы (немного утомительно).
  3. Разделите конфигурации в Application на более мелкие конфигурации с помощью таких функций, как WebConfig, DataJpaConfig и т.д. Полнофункциональная конфигурация (смешанная сеть, данные, безопасность и т.д.) Также привела к сбою ваших тестов на основе test slice. Проверьте тестовые образцы в мой образец .
2
Hantsy

Я думаю, что лучшее решение этой проблемы - выровнять структуру папок тестов со структурой папок приложения.

У меня была та же проблема, которая была вызвана дублированием моего проекта из проекта с другой структурой папок.

если ваш тестовый проект и проект приложения будут иметь одинаковую структуру, вам не потребуется добавлять какие-либо специальные аннотации к вашим тестовым классам, и все будет работать как есть.

0
silver

В моем случае пакеты были разными для классов Application и Test.

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

а также

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

После того, как они согласились, тесты прошли правильно.

0
Nick