簡體   English   中英

Spring Data JPA-為什么在測試中出現空bean異常?

[英]Spring Data JPA - Why do I get null bean exception in the test?

我想使用Spring Data JPA進行ORM。 我有以下聲明的存儲庫接口:

public interface SegmentRepository extends JpaRepository<Segment, Integer> {
    // query methods ...
}

以下是Java Config類:

@Configuration
@EnableJpaRepositories("com.example.cap.repositories")
@EnableTransactionManagement
public class CAPRepositoryConfig {
    @Bean
    public DataSource dataSource() {
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName(org.postgresql.Driver.class.getName());
        ds.setUsername("postgres");
        ds.setPassword("password");
        ds.setUrl("jdbc:postgresql://localhost:5432/postgres");
        ds.setInitialSize(10);
        return ds;
    }

    @Bean
    public EntityManagerFactory entityManagerFactory() {

        EclipseLinkJpaVendorAdapter vendorAdapter = new EclipseLinkJpaVendorAdapter();
        vendorAdapter.setGenerateDdl(true);

        LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
        Map<String, Object> jpaProperties = new HashMap<String, Object>();
        jpaProperties.put("eclipselink.weaving", "false");
        factory.setJpaVendorAdapter(vendorAdapter);
        factory.setPackagesToScan("com.example.cap.repositories");
        factory.setDataSource(dataSource());
        factory.setJpaPropertyMap(jpaProperties);
        factory.afterPropertiesSet();

        return factory.getObject();
    }

    @Bean
    public PlatformTransactionManager transactionManager() {

        JpaTransactionManager txManager = new JpaTransactionManager();
        txManager.setEntityManagerFactory(entityManagerFactory());
        return txManager;
    }
}

Segment類在com.example.cap.repositories定義為:

@Entity
public class Segment {
    @Id
    private int segmentID;
    private int caseID;
    private Timestamp segStartTime;
    private Timestamp segEndTime;

    //setter and getters
}

但是,當我使用自動注入的bean SegmentRepository運行JUnit測試時,我得到了bean repository空值異常:

@ContextConfiguration(classes=CAPRepositoryConfig.class)
public class CAPRepositoryTest {

    @Autowired
    private SegmentRepository repository;

    @Test
    public void testRepository() {
        Segment seg = repository.findOne(123);    //null pointer exception for repository
    }
}

根據Spring Data JPA文檔,只要我在Java Config類中指定@EnableJpaRepositories ,就應該自動注入SegmentRepository Bean repository 但是,為什么我在JUnit測試類中得到repository空指針異常? 由於SegmentRepository是接口而不是類,因此無法通過Java Config類創建實例。

我認為您忘記了SpringJUnit4ClassRunner ,它使@Autowired在測試中起作用:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes=CAPRepositoryConfig.class)
public class CAPRepositoryTest { ... }

當我使用測試類並需要進行單元測試時,我更喜歡實例化該類,因為盡管您有一個接口,但也需要實現類。 就我而言,我做這樣的事情:

 @ContextConfiguration(classes=CAPRepositoryConfig.class)
 public class CAPRepositoryTest {

     private SegmentRepository repository;

     @Before
     public void testRepository() {
         repository = new SegmentRepositoryImpl();
     }

     @Test
     public void testRepository() {
         Segment seg = repository.findOne(123);
     }
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM