Spring Boot Data JPA与DB / 2 Configuration和JUnit有关

时间:2013-12-23 17:53:01

标签: java spring junit spring-data autowired

我正在开发一个想要使用spring-boot-data-jpa的项目。本地(IDE)数据库可以是H2。但是,对于所有服务器(dev / test / prod),我们不得不使用DB / 2(不幸的是!)。

我们似乎无法使用DB / 2。我们得到这样的错误:

java.lang.IllegalStateException: Failed to load ApplicationContext....
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No   
qualifying bean of type [...Repository] found for
dependency: expected at least 1 bean which qualifies as autowire candidate for this 
dependency. Dependency annotations: {}

运行单元测试(JUnit)时。注意,空白{}注释。从表面看来,这似乎是一个“明显”的问题。无法在类路径中加载或找到存储库bean。但是,当我们使用H2配置运行它时,它可以正常工作。

因此,下一个逻辑结论似乎是存储库配置(数据源等)未正确设置。但是,我们可以在非Spring启动应用程序中使用相同的配置值,它工作正常!

然后我认为它可能是不同的类加载器或cglib代理不使用“真正的”实现类。所以问题如下:

但是,这些问题的正确答案无法解决问题。所以这是我的帖子/问题。

如何弄清楚这个问题的根本原因?我试图在调试器中遍历代码(spring和我们的代码),但无法缩小原因。

然后我尝试了这个,我拿了示例spring boot jpa并修改它以使用DB / 2的特定属性,我可以得到同样的失败。因此,我的配置似乎一定是错误的,或者Spring代码中存在错误。我已经与其他人一起查看了配置,但我们没有看到问题。我们在另一个(非春季启动应用程序)中尝试了此配置并且它可以工作。

这是一个patch file,它显示了原始jpa示例与修改过的示例之间的差异以及配置更改。注意,我们删除了DB2服务器的详细信息。希望这使得问题可以为任何人重现,然后可以帮助找出原因。

TIA,

斯科特

编辑1 ---直接在这里添加配置详细信息,而不是补丁文件---

Java配置

@Configuration
@ComponentScan
@EnableAutoConfiguration
@PropertySource("classpath:application.properties")
public class SampleDataJpaApplication {

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

属性文件

spring.jpa.hibernate.naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.hibernate.dialect: org.hibernate.dialect.DB2Dialect
#spring.jpa.database-platform: DB2Platform
spring.jpa.show-sql: true
spring.jpa.generate-ddl: true

spring.datasource.driverClassName: om.ibm.db2.jcc.DB2Driver
spring.datasource.url: jdbc:db2:someDB2-db:5000
spring.datasource.username: fakeuser
spring.datasource.password: fakepassword
spring.datasource.schema:schema-name

单元测试配置

@RunWith(SpringJUnit4ClassRunner.class)
@PropertySource("classpath:application.properties")
@ContextConfiguration(classes = SampleDataJpaApplication.class, loader =       AnnotationConfigContextLoader.class)
public class CityRepositoryIntegrationTests {
 //....
}     

这应该与仅更改用户/密码/ jdbc URL的修补程序文件几乎相同,以隐藏环境的细节。

4 个答案:

答案 0 :(得分:3)

据我所知,JUnit设置不正确。要让Boot正常工作,您有两种选择:

  1. 使用@SpringApplicationConfiguration代替@ContextConfiguration

    Boot配置ApplicationContext引导过程相当多,例如启用默认配置文件。使用自定义注释也会自动激活JUnit执行的内容。

  2. 自己配置@ContextConfiguration适当的听众

    在您的情况下,除了注册的所有默认值之外,您至少需要ConfigFileApplicationContextInitializer

  3. 由于第二种选择相当繁琐,我强烈建议您选择第一种选择并查看引导您的位置。

答案 1 :(得分:0)

奥利弗,

我似乎无法使用how-to中定义的spring-boot-starter-test JAR找到注释@SpringApplicationConfiguration。我正在使用弹簧靴0.5.0.M6。以下是我的Maven POM中的依赖项。我在这里缺少什么?

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>4.0.0.RELEASE</version>
</dependency>

编辑:在查看Spring Boot示例项目之后,我找到了一种不同的方法来让Junit和Spring测试相互配合。如果您可以定义您的类,那么下面的内容应该与Oliver在其选项1的回复中提到的相同。请注意,需要存在“loader”参数才能正确配置侦听器和正确支持bean。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyDataApplication.class, loader = SpringApplicationContextLoader.class)
public class MyServiceTest {

答案 2 :(得分:0)

我在Spring Boot中遇到类似的集成测试问题,我可以确认@ user3166395解决方案。

此配置适用于我:

import org.springframework.boot.test.SpringApplicationContextLoader;
import org.springframework.test.context.ContextConfiguration;
...

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = MyDataApplication.class, loader = SpringApplicationContextLoader.class)
public class MyServiceTest {

   @Autowired
   CityRepository cityRepository;

}

这需要测试依赖性:

org.springframework.boot:spring-boot-starter-test:0.5.0.M7

我无法使用SpringApplicationConfiguration

进行工作测试

答案 3 :(得分:0)

嘿伙计们有点迟到了,但要清楚你的错误(因为我复制了它,我也有同样的感受):

spring.datasource.driverClassName: **om**.ibm.db2.jcc.DB2Driver

应该是

spring.datasource.driverClassName: **com**.ibm.db2.jcc.DB2Driver

到目前为止,这对我有用。