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

如何测试Spring MVC和存储库MongoDb

薛阳荣
2023-03-14
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.

共有1个答案

乔丁雨
2023-03-14

JUnit是一个广泛的主题,您应该了解它:https://JUnit.org/junit5/

请注意,JUnit5是当前版本(我看到您已经用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() {
        ....
    }
}
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
        <scope>test</scope>
    </dependency>
 类似资料:
  • 我想要一个在Spring数据的帮助下创建的存储库(例如)。我不熟悉spring-data(但不熟悉spring),我使用本教程。我选择的处理数据库的技术是JPA2.1和Hibernate。问题是我不知道如何为这样的存储库编写单元测试。 让我们以方法为例。由于我正在进行测试--首先,我应该为它编写一个单元测试--这就是我遇到三个问题的地方: > 首先,如何将的模拟注入到不存在的接口实现中?Sprin

  • 我是新的弹簧靴,做了我的第一个实体。如何测试存储库?我使用的是本地MySQL数据库。那么第一步就是嘲弄数据库? 而我的存储库只是扩展了Jparepository。 我得到的错误是java.lang.IllegalStateException:未能加载ApplicationContext。还有一点:无法用嵌入式数据库替换DataSource进行测试。如果您想要一个嵌入式数据库,请在类路径上放置一个受

  • 我有一个问题与存根我的存储库。有人建议我只创建另一个application.properties(我没有这样做),并使用像H2这样的内存数据库。不过,我想知道我是否可以只是存根调用,这样当调用MyDataService.FindById(id)而不是试图从数据库中获取它时,就可以返回一个模拟对象?

  • 我在玩spring数据存储库,有一个关于编写CRUD测试的问题。我针对Hibernate DAO和EJB3实体bean编写了许多CRUD测试,在这些测试中,我创建和实体,将其刷新到数据库中,清除实体管理器,并按ID读回它。实体管理器被清除,因此第一级缓存不会在读取时被击中。 使用spring数据存储库,我找不到一种方法来清除测试使用的底层实体管理器,这样我的读取就不会返回到实际的数据库,使我的测试

  • } 然后我有我的服务课,看起来像这样 然后是我的存储库:

  • 我正在使用Spring Boot进行多模块项目。我想编写一些单元测试来检查我的存储库,服务等。存储库代码是在公共项目上编写的,而公共项目在其他项目上使用。此项目不包含任何初学者应用。它只是由实体、存储库和服务组成。 我看到这个主题(如何使用Spring Boot测试Maven模块项目)关于类似的问题,但我没有设法成功地实现它来测试我的存储库。 当我启动测试时,EntityARepository会引