无法在 Springboot 测试类中实例化 Repository bean

问题描述

我尝试在 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 (将#修改为@)