如何解决如何测试 Spring MVC 和存储库 MongoDb
有人可以帮助我对服务、控制器和存储库进行 junit 测试吗?我在为服务和控制器类编写测试用例时遇到很多错误。
这是我的服务类
import com.controller.ValidatorClass;
import com.model.Entity;
import com.model.Status;
import com.repository.Repository;
@Service
public class Service {
@Autowired
private Repository repository;
@Autowired
private SequenceGeneratorService service;
public ResponseEntity storeInDb(ExecutorEntity model) {
ValidatorClass validation = new ValidatorClass();
Map<String,String> objValidate = validation.getInput(model.getLink(),model.getUsername(),model.getpassword(),model.getSolution());
model.setId(service.getSequenceNumber(Entity.SEQUENCE_NAME));
model.setStatus(Status.READY);
repository.save(model);
return new ResponseEntity(model,HttpStatus.OK);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public List<String> handleValidationExceptions(MethodArgumentNotValidException ex) {
return ex.getBindingResult()
.getAllErrors().stream()
.map(ObjectError::getDefaultMessage)
.collect(Collectors.toList());
}
}
这是我的控制器类
@RestController
@RequestMapping(value = "/create")
public class Controller {
@Autowired
private Service service;
@RequestMapping(value = "/create",method = RequestMethod.POST)
public ResponseEntity code(@Valid @RequestBody Entity model) {
return service.storeInDb(model);
}
我的模型类
@Transient
public static final String SEQUENCE_NAME = "user_sequence";
@NotNull(message = "Name can not be Null")
private String username;
@NotNull(message = "Password can not be Null")
private String password;
@NotNull(message = "Jenkins Link can not be Null")
private String Link;
@NotNull(message = "Solution can not be Null")
private String solution;
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
private Status status; //enum class having READY and FAIL as values.
连同 getter 和 setter。
解决方法
JUnit 是一个广泛的主题,您应该仔细阅读:https://junit.org/junit5/
请注意,JUnit 5 是当前版本(我看到您用 junit4
标记了您的问题)。
我会给你一个关于如何编写一些集成测试的想法,只是为了让你开始。在通往智慧的旅途中,您可能会遇到 TestRestTemplate
,但现在建议使用 WebTestClient
。
下面的测试将使您的应用程序的所有部分都能正常运行。当您获得更多经验时,您可能还会测试应用程序的各个部分。
package no.yourcompany.yourapp.somepackage;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.reactive.AutoConfigureWebTestClient;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.test.web.reactive.server.WebTestClient;
import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureWebTestClient
public class ExecutorControllerTest {
@Autowired
WebTestClient webTestClient;
@Test
public void postExecutor_validModel_receiveOk() {
webTestClient
.post().uri("/executor")
.bodyValue(createValidExecutorEntity())
.exchange()
.expectStatus().isOk();
}
@Test
public void postExecutor_validModel_receiveResponseEntity() {
webTestClient
.post().uri("/executor")
.bodyValue(createValidExecutorEntity())
.exchange()
.expectBody(ResponseEntity.class)
.value(responseEntity -> assertThat(responseEntity).isNotNull());
}
private static ExecutorEntity createValidExecutorEntity() {
....
}
}
对于 spring-boot-starter-test
的依赖,没有必要向 JUnit 添加显式依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
为了使用 WebTestClient
,请将以下内容添加到您的 POM:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
<scope>test</scope>
</dependency>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。