Не удалось найти @ 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 ответов:
действительно, 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{ }
давайте посмотрим на вашу проблему,
- не смешивайте
@DataJpaTest
и@SpringBootTest
, как сказано выше@DataJpaTest
будут строить конфигурацию по-своему(например. по умолчанию он попытается подготовить встроенный H2 вместо этого) из наследования конфигурации приложения.@DataJpaTest
предназначен для