当前位置: 首页 > 知识库问答 >
问题:

使用内存数据库为Rest控制器编写测试

宋弘壮
2023-03-14

我正在编写一个Spring boot Rest控制器的测试。这个rest控制器将一些值写入DB。

我想使用Spring为这个测试提供的内存数据库。根据这个文档,我必须用@datajpatest注释测试类,这导致了这个错误:

java.lang.IllegalStateException: Failed to load ApplicationContext

在错误堆栈跟踪中,我看到抛出了以下异常:

由:org.springframework.beans.factory.unsatisfieddependencyException:创建名为'org.springframework.boot.autoconfigure.orm.jpa.hibernatejpaautoconfiguration'的bean时出错:通过构造函数参数0表示的未满足的依赖关系;嵌套异常是org.springframework.beans.factory.BeanCreationException:创建名为“data source”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:未能将DataSource替换为用于测试的嵌入式数据库。如果您想要一个嵌入式数据库,请在类路径上放置一个受支持的数据库,或者调优@AutoConfigureTestDatabase.的replace属性

这是我正在研究的测试类:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
@DataJpaTest
public class AuthenticationControllerFTest {

    @Autowired 
    private MockMvc mockMvc;

    @MockBean
    private AuthenticationManager authenticationManager;

    @Autowired
    private WebApplicationContext context;

    @Autowired
    private Filter springSecurityFilterChain;

    @Before
    public void setup() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .addFilters(springSecurityFilterChain).build();
    }

    @Test
    public void testCreate() throws Exception {

        String exampleUserInfo = "{\"name\":\"Salam12333\",\"username\":\"test@test1.com\",\"password\":\"Salam12345\"}";
        RequestBuilder requestBuilder = MockMvcRequestBuilders
                .post("/signup")
                .accept(MediaType.APPLICATION_JSON).content(exampleUserInfo)
                .contentType(MediaType.APPLICATION_JSON);

        MvcResult result = mockMvc.perform(requestBuilder).andReturn();

        MockHttpServletResponse response = result.getResponse();
        int status = response.getStatus();
        Assert.assertEquals("http response status is wrong", 200, status);
    }
}

是什么导致了这个错误?

spring.datasource.username = hello
spring.datasource.password = hello
spring.datasource.driver-class-name= com.mysql.jdbc.Driver
spring.datasource.url = jdbc:mysql://localhost:3306/myproject?useSSL=false

spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=TRACE
logging.level.org.springframework.web=DEBUG

server.port = 8443
server.ssl.key-store = classpath:tomcat.keystore
server.ssl.key-store-password = hello
server.ssl.key-password = hello
server.ssl.enabled = true
server.ssl.key-alias=myproject

编辑2

我在pom.xml中添加了以下内容:

<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>test</scope>
</dependency>

我创建了application-test.properties,内容如下:

spring.datasource.username= root
spring.datasource.password= password
spring.datasource.driver-class-name= org.h2.Driver
spring.datasource.url= jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
  1. 用户名和密码是什么?我应该把它们设置在哪里?
  2. 我还将@activeprofiles(“test”)添加到测试类中,当我运行测试时,我会得到一个错误,其中包括以下行:

由:org.hibernate.hibernateException引起:当'hibernate.diocial'未设置时,对DiquartResolutionInfo的访问不能为空

共有1个答案

黄飞翮
2023-03-14

假设您使用@springbootapplication注释类,它支持自动配置,并且具有类路径的h2依赖项(请参见下文)spring boot将看到h2内存数据库依赖项,并创建javax.sql.datasource实现。默认连接URL为jdbc:h2:mem:testdb,默认用户名和密码为:username:sa和password:empty。

Application.Properties文件

spring.datasource.url=jdbc:h2:mem:tesdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE
    spring.datasource.driverClassName=org.h2.Driver
    spring.datasource.username=sa
    spring.datasource.password=

    spring.datasource.testWhileIdle = true
    spring.datasource.validationQuery = SELECT 1

    spring.jpa.show-sql = true
    spring.h2.console.enabled=true // if you need console

H2依赖性

    <dependency>
      <groupId>com.h2database</groupId>
       <artifactId>h2</artifactId>
      <scope>runtime</scope>
   </dependency>

   <dependency> // If you need h2 web console 
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
 类似资料:
  • 我对Spring boot和JUnit是新手。我在Spring Boot中有一个Rest服务,在那里我接收请求,使用请求参数查询数据库,从查询中接收结果并将其作为响应发送。 我的控制器代码如下所示: 我的JdbcTemplate被作为一个单独类中的bean处理,如下所示 我的代码运行良好。 现在我想使用JUnit4为我的控制器编写单元测试。我使用MockMvc发送请求,但我的单元测试从未起飞。它总

  • 如何为RestController,Service和DAO层编写JUnit测试用例? 我试过 如何验证rest控制器和其他层中的CRUD方法?

  • 我需要在我的主机上运行composer update,因此我使用ssh登录,并尝试在/www文件夹中运行以下命令,我在该文件夹中安装了Laravel和composer: 我得到这个错误: 我正在与我的主机提供商联系,他们告诉我运行命令: 我运行了这个命令,但得到:“无法打开文件:composer” 怎么办?这里的解决方案是什么?

  • 问题内容: 请参阅下面的解决方案: 我正在尝试连接到Parse.com Rest后端并显示对象值中的数据。 HTML(我进行了几次角度调用以确保捕获输出): JAVASCRIPT休息: 这是行不通的,它完全不执行任何操作,甚至在控制台中也没有消息。我知道rest调用具有正确的凭据,因为当我使用rest测试器程序对其进行测试时,我能够获得返回的对象内容。也许网址不应该是绝对的?任何线索都非常受欢迎,

  • 我试图使用mockmvcbuilders.standalonesetup方法为一个spring mvc rest控制器创建一个非常基本的单元测试。我一直收到一个404错误。下面列出了测试应用程序上下文、测试类、控制器和整个堆栈跟踪。欢迎任何指导。 java.lang.AssertionError:状态应为:<200>但实际为:<404>在org.springframework.test.util.

  • 我在一个Spring Boot应用程序中使用H2数据库。但无法在http://localhost:8080/console的浏览器中打开它。我的pom.xml如下所示: Spring引导配置: Springboot配置文件