【发布时间】: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