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

SpringBoot应用程序中的控制器层测试

施翰学
2023-03-14

我的SpringBoot应用程序中有一个控制器:

@Controller  
@RequestMapping("/v1/item")  
public class Controller{

@Autowired
private ServiceForController service;

@PostMapping()
public String createItem(@ModelAttribute Item item) {
        Item i = service.createItem(item.getName(), item.getDomain());
        return "item-result";
    }
}

我想在mocks的帮助下,将其与服务分开进行测试。如何实施?

共有1个答案

阚正真
2023-03-14

至少有两种方法可以做到这一点:

>

  • 启动整个SpringBoot上下文并进行某种集成测试示例:

    @RunWith(SpringRunner.class)
    @SpringBootTest
    @AutoConfigureMockMvc
    public class ControllerTest {
       @Autowired
       private MockMvc mvc;
    
       @Test
       @WithMockUser(roles = "ADMIN")
       public void createItem() throws Exception {
          mvc.perform(post("/v1/item/")
                .param("name", "item")
                .param("domain", "dummy.url.com"))
                .andExpect(status().isOk());
          //check result logic
    }
    

    测试独占控制器层,并将整个加载的上下文限制为独占。示例:

    @RunWith(SpringRunner.class)
    @WebMvcTest(controllers = Controller.class)
    public class ControllerTest{
       @Autowired
       private MockMvc mvc;
    
       @MockBean
       private ServiceForController service;
       //testing methods and their logic
    ...
    }
    

    尽管第二种方法(对我来说)在使用的资源方面似乎更合理,但由于缺少初始化的bean,它可能会带来很多不便。例如,在我决定尝试另一个选项之前,我需要创建至少5个bean的模拟,这些bean被添加到我的ContollerTest类的SpringBoot start上下文中。

    因此,我不得不切换到将@SpringBootTest与@SpyBean结合使用的方法,这允许我调用Mockito验证()方法。

  •  类似资料:
    • 我有一个springboot应用程序,它根据LDAP验证身份验证。我通过邮递员测试了它,它工作得很好。我扩展了WebSecurityConfigurerAdapter以根据LDAP验证登录凭据。这是工作很好,没有任何问题。我有一个angular前端,我调用/login,并将用户名和密码发送到它。它没有工作,我得到一个CORs错误。我将下面的代码添加到application.java中,我再也看不到

    • 问题内容: 所有, 我已经用Java编写了基于命令行的PhoneBook应用程序。该应用程序基本上会询问用户的一些详细信息,例如姓名,年龄,地址和电话号码,并将它们存储在文件中。其他操作包括按名称,电话号码等查找电话簿。所有详细信息都通过控制台输入。 我正在尝试为我已实现的每个功能编写JUnit测试用例,但无法弄清楚如何将实现代码重定向到我的JUnit测试方法中的某个东西,当我的实际代码停止供用户

    • 使用spring-boot时,一切工作都很好。尽管如此,在spring-boot中已删除了注释和。我试图将代码重构为新版本,但我做不到。对于以下测试,我的应用程序在测试之前没有启动,http://localhost:8080返回404: 如何重构测试以使其在Spring-Boot1.5中工作?

    • 集成测试: 当我偶尔运行这个测试时,一切都很好,但是当我和其他测试一起运行它时,没有使用模拟的ServerThroughRabbitMQ,所以一些spring缓存强制使用旧的rabbit侦听器。 我试图调试它,我可以看到,正确的bean被autowired到测试中,但由于某些原因旧监听器使用(旧bean字段instanceID=1新mocked bean instanceID=3),测试失败(不确

    • 因此,我正在进行我的第一个Spring Boot项目,我一直在进行测试。我查了很多例子,但似乎都不管用。 这是我的控制器的当前测试: 这是可行的,但在sonarqube上,我发现我的代码覆盖率为0%,而我似乎找不到一个测试,它的覆盖率甚至超过了零。有谁能给我一个关于如何为控制器编写一个好的单元测试的例子,然后我就可以根据您的例子自己解决这个问题。 这是我的控制器: 这是我的服务(以防您需要): 还

    • 我正在使用一个spring启动应用程序,它运行我的src/main/resources/config/application。yml。 当我通过以下方式运行测试用例时: 测试代码仍在运行我的应用程序。要加载属性的yml文件。我想知道是否有可能再运行一个*。运行测试用例时的yml文件。