【问题标题】:Junit Testing @getmappings with h2 in memory database在内存数据库中使用 h2 进行 Junit 测试 @getmappings
【发布时间】:2020-03-20 20:48:54
【问题描述】:

我在对 DbRequest 控制器进行单元测试时遇到问题。我有一个单元测试工作,但我无法实现 DBRequest 控制器 GET 映射的单元测试,它使用休眠进行数据库查找。我为 junit 测试创建了一个内存数据库中的 H2。 我尝试了各种不同的设置,但似乎都无法正常工作。

编辑下面,我得到一个 NullPointer,

java.lang.NullPointerException
    at com.lmig.informaticaservice.api.DBcontroltest.saveTest(DBcontroltest.java:74)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

这是经过编辑的测试。

@RunWith(SpringRunner.class)
@SpringBootTest

@AutoConfigureTestDatabase(replace = AutoConfigureTestDatabase.Replace.NONE)
public class DBcontroltest {



@Autowired
DbRequest dbRequest;


    @Autowired
    ConnectionRequestRepository connectionRequestRepository;

    private MockMvc mockMvc;
    // @Autowired
   //private TestEntityManager entityManager;



     @Test
    public void saveTest() throws Exception {
         ConnectionRequest connectionRequest = new ConnectionRequest((long) 1, "test");
         connectionRequestRepository.save(connectionRequest);


         System.out.println(connectionRequestRepository.findAll().toString());

         mockMvc.perform(get("/api/selectDB/{connectionId}" ,1))
                 .andExpect(status().isOk());


    }

}


Typical JPA repository 

    package com.test.models;

    import org.springframework.data.jpa.repository.JpaRepository;

    public interface ConnectionRequestRepository extends JpaRepository<ConnectionRequest, Long> {

    }

这是我的控制器。

package com.test.api;

import com.models.ConnectionRequest;
import com.test.models.ConnectionRequestRepository;

import java.util.List;

import javax.validation.Valid;

import lombok.Data;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Data
@RestController
@RequestMapping("/api/")
public class DbRequest {

    @Autowired
    private ConnectionRequestRepository connectionRequestRepository;
    private ConnectionRequest connectionRequest;

    @GetMapping("/selectDB")
    public List<ConnectionRequest> getAllRequests() {
        return connectionRequestRepository.findAll();
    }

    @GetMapping("/selectDB/{connectionId}")
    public ResponseEntity<ConnectionRequest> getRequestById(@PathVariable("connectionId") Long connectionId) throws Exception {
        ConnectionRequest connectionRequest = connectionRequestRepository.findById(connectionId)
            .orElseThrow(() -> new Exception("Connection Request " + connectionId + " not found"));
        return ResponseEntity.ok().body(connectionRequest);
    }
}

这是数据库的模型。

package com.testing.models;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import org.springframework.data.jpa.domain.support.AuditingEntityListener;

@Data
@Entity
@Table(name = "connrequest", schema = "testschema")
@AllArgsConstructor
@NoArgsConstructor
@EntityListeners(AuditingEntityListener.class)
public class ConnectionRequest {

    @Id
    @Column(name = "connection_id", nullable = false)
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long connectionId;

    @Column(name = "requestor", nullable = false)
    private String requestor;
}

【问题讨论】:

  • 您不是在测试您的控制器,而只是在测试您的存储库。所以不确定这个问题与测试你的控制器有什么关系?
  • 我能够测试存储库,但我不确定如何在成功使用存储库代码的同时测试该控制器。我读过的任何东西似乎都不适用于 get 映射。
  • 您的存储库测试存在缺陷,因此尽管它可能有效,但它存在缺陷。您需要完整的集成测试,因此请使用 @SpringBootTest 注释进行控制器测试。如果您只想要控制器并模拟依赖项,请使用 @WebMvcTest 仅测试 Web 相关部分。
  • 有什么缺陷?它不提供完整的集成测试?
  • 您正在使用@ContextConfiguration@DataJpaTest(切片)与完整配置混合。使用其中之一,而不是两者。

标签: java spring-boot junit


【解决方案1】:

看起来ConnectionRequest的PK上的注释是有问题的。

注解@GeneratedValue 告诉JPA 它需要确定该值,因此任何为ID 提供的值都将被主动丢弃。来自文档

表示持久性提供程序必须为使用数据库标识列的实体分配主键

要解决此问题,请尝试删除该注释,因此您必须始终提供 ID,或者,在您的测试中保存实体后,获取分配的 ID 并用那个ID打电话给connectionRequestRepository.getOne()

【讨论】:

    猜你喜欢
    • 2018-09-12
    • 2015-11-20
    • 1970-01-01
    • 2014-12-20
    • 2013-07-13
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 2019-05-17
    相关资源
    最近更新 更多