繁体   English   中英

Spring Framework 是否用于单元测试?

[英]Is Spring Framework used in a unit test?

我正准备参加我的Spring Certification v5.0 ,但似乎有一个问题:您是否在单元测试中使用 Spring? 链接到考试指南问题

Spring 参考指南我知道这一点:

组成应用程序的 POJO 应该可以在 JUnit 或 TestNG 测试中进行测试,对象使用 new 运算符简单地实例化,无需 Spring 或任何其他容器

从我的研究中我也可以看出,我们只在测试控制器(如下所示)、存储库或创建集成测试以及其他一些情况时使用 Spring。 在这些情况下,我们需要 TestContext,它是org.springframework.*包的一部分。

@RunWith(SpringRunner.class)

@WebMvcTest(HelloWorldController.class)

那么,这个问题的正确答案是:不,我们不使用 Spring? 或者,是的,我们确实需要它 因为我们显然在某些情况下会使用它。

您提到的第一段是您问题的答案,您不需要 Spring 为您编写的类编写单元测试,即使它们是 Spring bean。

您提到的其他情况并不是真正的单元测试。 使用SpringRunner和模拟数据库测试存储库时,您不再编写单元测试,而是编写集成测试 这同样适用于使用MockMvc为您的控制器编写测试。 在这两种情况下,您都在测试 Spring 框架(Spring MVC 或 Spring Data)与代码(和数据库)之间的集成。

但是,您可以为控制器编写单元测试,但在这种情况下,您宁愿执行以下操作:

@Controller
public class HelloWorldController {
    @RequestMapping("/hello")
    public ModelAndView getHello() {
        return new ModelAndView("hello", "title", "hello world");
    }
}

public class HelloWorldControllerTest {
    private HelloWorldController controller;

    @Before
    public void setUp() {
        controller = new HelloWorldController();
    }

    @Test
    public void getHelloShouldUseHelloView() {
       assertThat(controller.getHello().getViewName()).isEqualTo("hello");
    }

    @Test
    public void getHelloShouldAddATitleModel() {
        assertThat(controller.getHello().getModel()).containsEntry("title", "Hello world");
    }
}

Spring是一个框架。 框架调用您,因此根据定义,将 spring 与控制器一起使用是一个集成点,不属于单元测试。

我已经成功地测试了我的控制器的行为,而不涉及任何弹簧。 我还通过要求 spring 模拟控制器并调用 mockMvc 成功地测试了控制器的注释。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM