问题描述
我尝试在 Springboot 中测试我的 JPA,但出现以下错误。参考了几个与之相关的线程并尝试了所有解决方案,但没有一个有效。
如果我将 @MockBean 用于存储库类,则数据不会持久化和检索。如果我使用@Autowired,则会出现上述错误。
我将@Springboottest 和@DataJpaTest 与@ContextConfiguration 一起使用,但没有一个注释可以解决问题。我在这里缺少什么?请帮忙。
Caused by: org.springframework.beans.BeanInstantiationException: 无法实例化 [de.api.repository.StyledLayerDescriptorStorageRepository]: 指定的类是一个接口
import de.api.entity.StyledLayerDescriptorEntity;
import de.api.entity.StyledLayerDescriptorEntityBuilder;
import de.api.repository.StyledLayerDescriptorStorageRepository;
import de.api.service.StyledLayerDescriptorStorageService;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.context.annotation.Profile;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.context.junit4.springrunner;
import java.time.OffsetDateTime;
import java.util.Optional;
@RunWith(springrunner.class)
@ContextConfiguration(classes = {de.api.repository.StyledLayerDescriptorStorageRepository.class})
@DataJpaTest
@EnableAutoConfiguration
public class StyledLayerDescriptorStorageRepositoryTest {
@Autowired
StyledLayerDescriptorStorageRepository styledLayerDescriptorStorageRepository;
@Test
@Profile(("Test"))
public void testRepository(){
String sldId = "5c0405b0-2a09-4d52-a702-6395445bd575";
StyledLayerDescriptorEntity sld =
new StyledLayerDescriptorEntityBuilder(
sldId,OffsetDateTime.parse("2021-03-11T09:00:07Z"),"my content")
.build();
styledLayerDescriptorStorageRepository.save(sld);
Optional<StyledLayerDescriptorEntity> sldRes = styledLayerDescriptorStorageRepository.findById(sldId);
}
}
仓库类
package de.api.repository;
import de.api.entity.StyledLayerDescriptorEntity;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import java.time.OffsetDateTime;
import java.util.List;
@Component
@Repository
public interface StyledLayerDescriptorStorageRepository extends JpaRepository<StyledLayerDescriptorEntity,String> {
public final static String FIND_BY_TIME_STAMP = "SELECT S.id FROM StyledLayerDescriptorEntity S WHERE S.timestamp<:timestamp";
@Query(FIND_BY_TIME_STAMP)
public List<String> findByTimeStamp(@Param("timestamp")OffsetDateTime timestamp);
}
package de.api.entity;
import javax.persistence.*;
import java.time.OffsetDateTime;
@Entity
@Table(name = "StyledLayerDescriptor")
public class StyledLayerDescriptorEntity {
@Id private String id;
private OffsetDateTime timestamp;
@Column(columnDeFinition = "NVARCHAR(max)")
private String sldContent;
public StyledLayerDescriptorEntity() {}
public StyledLayerDescriptorEntity(String id,OffsetDateTime timestamp,String sldContent) {
this.id = id;
this.timestamp = timestamp;
this.sldContent = sldContent;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSldContent() {
return sldContent;
}
public void setSldContent(String sldContent) {
this.sldContent = sldContent;
}
public OffsetDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(OffsetDateTime timestamp) {
this.timestamp = timestamp;
}
}
实体构建器
package de.api.entity;
import java.time.OffsetDateTime;
public class StyledLayerDescriptorEntityBuilder {
private String id;
private OffsetDateTime timestamp;
private String sldContent;
public StyledLayerDescriptorEntityBuilder(String id,String sldContent) {
this.id = id;
this.timestamp = timestamp;
this.sldContent = sldContent;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public OffsetDateTime getTimestamp() {
return timestamp;
}
public void setTimestamp(OffsetDateTime timestamp) {
this.timestamp = timestamp;
}
public String getSldContent() {
return sldContent;
}
public void setSldContent(String sldContent) {
this.sldContent = sldContent;
}
public StyledLayerDescriptorEntity build() {
return new StyledLayerDescriptorEntity(id,timestamp,sldContent);
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)