当我执行单元测试时,将抛出以下错误。请告知我是否遗漏了什么。我正在使用Spring Boot 2.1.1.RELEASE。谢谢
java.lang.IllegalStateException:无法检索@EnableAutoConfiguration基本包
application-test.yml
spring:
profiles: test
datasource:
driver-class-name: org.h2.Driver
url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1
username : xxx
password : xxx
jpa:
hibernate:
ddl-auto: update
cache:
type: simple
AppRepository.java
@Repository
public interface AppRepository extends CrudRepository<App, Integer> {
App findFirstByAppId(String appId);
}
AppRepositoryTest.java
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppRepository.class})
@EnableConfigurationProperties
@DataJpaTest
@ActiveProfiles("test")
public class AppRepositoryTest {
@Autowired
AppRepository appRepository;
@Before
public void setUp() throws Exception {
App app = new App();
app.setAppId("testId");
appRepository.save(app);
}
@Test
public void testFindFirstByAppId() {
assertNotNull(appRepository.findFirstByAppId("testId"));
}
}
程序包结构
└───src
├───main
│ ├───java
│ │ └───com
│ │ └───abc
│ │ └───app
│ │ ├───config
│ │ ├───data
│ │ │ ├───model
│ │ │ └───repository
│ │ ├───exception
│ │ ├───service
│ │ └───serviceImpl
│ └───resources
│ ├───META-INF
│ └───static
│ ├───css
│ ├───images
│ └───js
└───test
└───java
└───com
└───abc
└───app
├───data
│ └───repository
├───service
└───serviceImpl
根据 45.3 测试Spring启动应用程序文档,启用Spring启动功能(如@EnableAutoConfiguration
)的推荐方法是使用@SpringBootTest
而不是旧的@ContextConfiguration
:
Spring Boot提供了一个@SpringBootTest
注释,当您需要Spring Boot功能时,它可以用作标准sping-test@ContextConfiguration
注释的替代方案。该注释通过SpringApplication创建测试中使用的Application Context来工作。除了@SpringBootTest
之外,还提供了许多其他注释来测试应用程序的更具体的切片。
您可以尝试使用@ContextConfiguration
编写测试,这是部分Spring Boot设置,但您会遇到类似的问题。Spring Boot在很大程度上基于约定,例如组件扫描从包含@SpringBootApplication
注释类的包开始。不建议违反这些约定。
我尝试了Zaccus的解决方案,但这对我来说不管用。我使用的是Spring Boot 2.3.2.RELEASE和JUnit 5。对于我的情况,我需要将我的模型和存储库移动到一个单独的库中,因为它需要由我的Web应用程序和工具共享。
以下是我得到的工作:
无主或SpringApplication的Spring Boot JPA测试
package com.example.repository;
import com.example.model.Place;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.Optional;
import static org.assertj.core.api.Assertions.assertThat;
@DataJpaTest
@ContextConfiguration(classes={PlaceRepositoryTest.class})
@EnableJpaRepositories(basePackages = {"com.example.*"})
@EntityScan("com.example.model")
public class PlaceRepositoryTest {
@Autowired private DataSource dataSource;
@Autowired private JdbcTemplate jdbcTemplate;
@Autowired private EntityManager entityManager;
@Autowired private PlaceRepository repo;
@Test
void testInjectedComponentsAreNotNull(){
assertThat(dataSource).isNotNull();
assertThat(jdbcTemplate).isNotNull();
assertThat(entityManager).isNotNull();
assertThat(repo).isNotNull();
}
@Test
public void testInsert() throws Exception {
String placeName = "San Francisco";
Place p = new Place(null, placeName);
repo.save(p);
Optional<Place> op = repo.findByName(placeName);
assertThat(op.isPresent()).isTrue();
}
}
从Spring启动 2.1 开始,使用@DataJpaTest时,不再需要指定
@ExtendWith(SpringExtension.class)
@EnableJpaRepositories(basePackages = {"com.example.*"})
对于我的情况,basePackages={"com.example.*"}不是必需的,因为PlaceRepository和PlaceRepositoryTest在同一个包中。我只是在这里添加它,以防有人在不同的包中包含了包含存储库的测试。如果没有“basePackages”,@EnableJpaRepositories将默认扫描Spring Data存储库的带注释配置类的包。
最初,我只有以下注释:
@DataJpaTest
@ContextConfiguration(classes={PlaceRepositoryTest.class})
@EnableJpaRepositories(basePackages = {"com.example.*"})
我找到的网站说我只需要@DataJpaTest和@EnableJpaRepositories,但是,只有上面这些,我收到了以下错误:
java.lang.IllegalStateException: Failed to load ApplicationContext
:
:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'placeRepository' defined in com.example.repository.PlaceRepository defined in @EnableJpaRepositories declared on PlaceRepositoryTest: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: class com.example.model.Place
我花了一段时间才想明白。对于“不是托管类型”,我认为我的类位置有问题:
package com.example.model;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@NoArgsConstructor
@AllArgsConstructor
@Data
@Entity
public class Place {
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String name;
}
根本原因是Place没有作为实体扫描。要解决此问题,我需要添加
@EntityScan("com.example.model")
我在stackoverflow的另一个解决方案中找到了“@ entity scan ”: Spring boot——不是托管类型
以下是我的设置:
src
+ main
+ java
+ com.example
+ model
+ Place
+ repository
+ PlaceRepository
+ test
+ java
+ com.example
+ repository
+ PlaceRepository
<?xml version="1.0" encoding="UTF-8"?>
<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>jpa</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<properties>
<spring.boot.starter.version>2.3.2.RELEASE</spring.boot.starter.version>
<h2.version>1.4.200</h2.version>
<lombok.version>1.18.12</lombok.version>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.source>1.8</maven.compiler.source>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>${spring.boot.starter.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring.boot.starter.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
package com.example.repository;
import org.springframework.data.repository.CrudRepository;
import org.springframework.stereotype.Repository;
import com.example.model.Place;
import java.util.Optional;
@Repository
public interface PlaceRepository extends CrudRepository<Place, Long> {
Optional<Place> findByName(String name);
}
当我删除“活动配置文件”和“启用配置属性”并最终在上下文配置注释中指定Main类时,我设法使它工作:
@RunWith(SpringRunner.class)
@ContextConfiguration(classes = {AppMain.class})
@DataJpaTest
public class AppRepositoryTest {
@Autowired
AppRepository appRepository;
@Before
public void setUp() throws Exception {
App app = new App();
app.setAppId("testId");
appRepository.save(app);
}
@Test
public void testFindFirstByAppId() {
assertNotNull(appRepository.findFirstByAppId("testId"));
}
}
我正在从2.1.4更新我现有的springstart项目- 扩展的类的退出代码如下 这是一个在更新之前正在运行的现有代码。更新后,当应用程序启动时,我会看到以下日志:
我得到java.lang.NoSuch方法例外请帮助我在这... 这就是我得到的错误- 错误:java.lang.运行时异常:java.lang.NoSuchmethod异常:com.nielsen.GRFE.processor.mapreduce.占位符$PlaceholderMapper.()在org.apache.hadoop.util.Reflse Utils.new实例(Reflse U
在ubuntu 14.1上的Jenkins install上运行TestNG测试用例时,出现“Java . lang . illegalstateexception:驱动程序不可执行”错误。如果Chromedriver不能在安装在ubuntu上的jenkin上启动,在Window操作系统上的jenkin install上尝试相同的配置,工作正常。请给我提供任何解决方案,如果有的话。 控制台输出 :
我正在尝试在我的maven项目上运行单元测试(使用Wiremck),并观察到以下错误。 我尝试将添加到中,如下所示 并已将其放在我的项目的文件中,并验证它是否是通过执行设置的,但我仍然收到相同的错误。 它在带有Java 8 u191的Windows机器上工作,并且没有添加任何,但在带有Java 8 u181的Linux上却不起作用。 我还尝试向我的< code>pom.xml添加以下依赖项 但仍然
尝试完成Spring Boot教程:https://Spring.io/guides/gs/spring-boot/#initial 以下是我的课程: 和pom.xml: 当我尝试使用以下命令运行它时:“mvn package&&java-jar target/gs-spring-boot-0.1.0.jar”,我得到的是: “-dmaven.home=C:\program files\jetbr