![](/img/trans.png)
[英]Spring Data JPA and Mockito - why save() return null in test?
[英]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.