【问题标题】:Is Spring Framework used in a unit test?单元测试中是否使用了 Spring Framework?
【发布时间】:2018-10-25 02:07:57
【问题描述】:

我正准备参加我的 Spring 认证 v5.0,似乎有一个问题:您在单元测试中使用 Spring 吗?Link to Exam Guide questions

来自Spring reference guide我知道这个:

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

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

@RunWith(SpringRunner.class)

@WebMvcTest(HelloWorldController.class)

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

【问题讨论】:

  • @Downvoter:你不需要仅仅因为我试图更好地理解一个概念而投反对票。 :)
  • 'using Spring'和'using a SpringRunner'并不完全相同
  • 嘿@Stultuske,你是对的,但是由于SpringRunner是在springframework包上找到的:(org.springframework.test.context.junit4.SpringRunner),我推断出我们实际上在这里使用的是Spring ;并且测试模块自带弹簧芯

标签: java spring unit-testing spring-boot junit


【解决方案1】:

您提到的第一段是您问题的答案,您不需要 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");
    }
}

【讨论】:

  • 非常感谢您的澄清!
  • @strg 没问题!虽然我必须说那个认证问题很模糊。
  • 实际上我们可能会在单元测试中使用 spring-test 包的某些部分。特别是 mock 子包是由 Spring 框架为此目的提供的。文档摘录:然而,对于某些单元测试场景,Spring 框架提供了模拟对象和测试支持类。 但当然,您的单元测试不必依赖/使用这些类...
  • 这有点主观,但是控制器测试什么时候应该使用spring?上面的示例是一个非常严格的单元测试,但在某些场景中,我使用了手动设置的 mock mvc,并结合 mockito 来模拟其他使用的类,并以这种方式对 rest 控制器进行单元测试。它不使用 spring,也不是上述的“传统”单元测试,但它在稍微模拟的 web 环境中测试控制器,即比上面更接近它的实际用法,避免了在单元中使用 spring 的开销测试并且仍在与其他类隔离测试
  • @jbailie1991 这在很大程度上取决于您要测试的内容。您是纯粹对控制器中的调用感兴趣,还是也想测试您的控制器映射?如果您想测试第一个,使用模拟框架的简单单元测试就足够了。如果你想要后者,你可以使用 mock mvc 编写一个测试。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-22
    • 1970-01-01
    相关资源
    最近更新 更多