如何测试 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>