Java单元测试Http获取测试用户自动生成

hec6srdp  于 2023-01-24  发布在  Java
关注(0)|答案(2)|浏览(159)

我在rest中编写函数来自动生成具有admin角色的用户。
UserController.java

@RestController
@RequestMapping("users")
public class UserController {

    @Autowired
    private UserRepository userRepo;
    @Autowired
    private TokenRepository tokenRepo;
    
    @GetMapping("admin")
    public String getAdmin () {
        JSONObject report = new JSONObject();
        String dataAdmin = userRepo.findByUsername("admin");
        if(dataAdmin == null) {
            User myadmin = new User();
            myadmin.setUsername("admin");
            myadmin.setFirstname("admin");
            myadmin.setLastname("admin");
            myadmin.setEmail("admin@admin");
            myadmin.setRole("admin");
            userRepo.save(myadmin);
            report.put("message", "admin generated");
        } else {
            report.put("message", "admin only generated once");
        }
        return report.toString();
    }

我试图按照这里的指示https://www.springboottutorial.com/unit-testing-for-spring-boot-rest-services。在 * 单元测试Http获取操作 * 部分。我得到了几个问题,也尝试不同的解决方案,直到我遇到这个Unit testing a Get request in a spring project从stackoverflow。下面是测试脚本,我已经到目前为止。

package blablaaa.order;

import java.util.ArrayList;
import java.util.List;

import org.json.JSONObject;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.http.MediaType;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;

import blablaaa.order.controller.UserController;
import blablaaa.order.dao.UserRepository;
import blablaaa.order.model.User;

//@ExtendWith(SpringExtension.class)
//@SpringBootTest
@WebMvcTest(value = UserController.class)
class OrderApplicationTests {
//  
    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserRepository userRepo;

    @Test
    void contextLoads() throws Exception{

        User myadmin = new User();
        myadmin.setUsername("admin");
        myadmin.setFirstname("admin");
        myadmin.setLastname("admin");
        myadmin.setEmail("admin@admin");
        myadmin.setRole("admin");
        
        List<User> myUser = new ArrayList<>();
        myUser.add(myadmin);
        RequestBuilder rb = MockMvcRequestBuilders.get("/users/admin").accept(MediaType.APPLICATION_JSON);
        MvcResult result = mockMvc.perform(rb).andReturn();
        JSONObject expect = new JSONObject();
        expect.put("message", "admin generated");
//      System.out.println(result.toString());
        System.out.println(expect.toString());
//      Assertions.assertTrue(result.toString().contains(expect.toString()));
    }

}

我不知道,测试应该如何编写。任何关键字有关这一点?
[更新]
下面是我的主要:

// OrderApplication.java
@SpringBootApplication
@EnableMongoRepositories("blablaaa.order.dao")
public class OrderApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class, args);
    }

}

这是我的程序错误日志

Description:

Field tokenRepo in blablaaa.order.controller.UserController required a bean named 'mongoTemplate' that could not be found.

The injection point has the following annotations:
    - @org.springframework.beans.factory.annotation.Autowired(required=true)

Action:

Consider defining a bean named 'mongoTemplate' in your configuration.
dphi5xsq

dphi5xsq1#

首先你要做的是清楚地理解你的方法getAdmin在做什么,其次要清楚地识别你的依赖项以及它们在main方法中是如何交互的。最后,你要定义你想要测试的东西,在你的例子中你有两个例子。if例子和else例子。
在测试中,必须使用when().thenReturn()...定义模拟的行为
测试方法如下所示:

@WebMvcTest(value = UserController.class)
class OrderApplicationTests {

    @Autowired
    private MockMvc mockMvc;
    
    @MockBean
    private UserRepository userRepo;

    @Test
    void contextLoads_whenNotNull() throws Exception{

        User myadmin = new User();
        myadmin.setUsername("admin");
        myadmin.setFirstname("admin");
        myadmin.setLastname("admin");
        myadmin.setEmail("admin@admin");
        myadmin.setRole("admin");

        when(userRepo).thenReturn(myadmin)

        mockMvc.perform(get("/users/admin")
                        .contentType(MediaType.APPLICATION_JSON))
                .andExpectAll(
                        status().isOk(),
                        jsonPath("$.message", containsString("admin generated"))
                );
    }

    @Test
    void contextLoads_whenIsNull() throws Exception{

        when(userRepo).thenReturn(null)
        mockMvc.perform(get("/users/admin")
                    .contentType(MediaType.APPLICATION_JSON))
            .andExpectAll(
                    status().isOk(),
                    jsonPath("$.message", containsString("admin only generated once"))
            );
    }
}

有关详细信息:https://www.bezkoder.com/spring-boot-webmvctest/

lc8prwob

lc8prwob2#

以前我是laravel用户。当我运行单元测试时,我不需要在运行测试场景之前运行应用程序。所以我认为,错误日志告诉我mongo数据库没有连接到应用程序,甚至应用程序本身也没有运行。
因此,根据我的情况,我需要确保首先运行应用程序,而不是构建。如果我只构建应用程序,程序将保持错误。
默认情况下,当你需要构建应用程序时,你需要确保应用程序也已经在运行了,SpringBoot也会在构建jar文件之前运行测试用例。
首先,运行应用程序

mvn spring-boot:run

然后,

  • 只能运行测试用例
mvn test
  • 或构建您的应用程序
mvn clean package

相关问题