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

spring boot中的单元测试

伯晨
2023-03-14

我对SpringBoot非常陌生,并试图学习如何在SpringBoot中进行测试。我读到了@SpringBootTest注释,它有助于集成测试应用程序。我想知道在SpringBoot中应该如何进行单元测试。单元测试是否需要指定@SpringBootTest注释,还是仅用于集成测试?是否有用于单元测试的特定注释?

任何指点都将不胜感激。提前谢谢!

编辑:SpringBootTest注释是否仅用于集成测试?我在Spring留档中找到了以下代码示例:

@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class HelloControllerTest {

@Autowired
private MockMvc mvc;

@Test
public void getHello() throws Exception {
    mvc.perform(MockMvcRequestBuilders.get("/").accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andExpect(content().string(equalTo("Greetings from Spring Boot!")));
}
}

这是单元测试还是集成测试?我猜这不是一个集成测试,因为它使用了MockMvc。是这样吗?如果是的话,这是否意味着@SpringBootTest注释可以用于不是完整集成测试的测试?

共有2个答案

越朗
2023-03-14

这就是我要做的:对于端到端的集成测试:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ApplicationTests {

    @Autowired
    private TestRestTemplate restTemplate;
    @Autowired
    private CarRepository repository;
    @Autowired
    private CarService carService;

    @Test
    public void contextLoads() {
    }

    @Test
    public void basicTest() {
        String body = this.restTemplate.getForObject("/", String.class);
        assertThat(body).contains("Not Found");
    }
}

仅用于测试控制器(控制器单元测试):

    @RunWith(SpringRunner.class)
    @WebMvcTest(controllers = CarController.class, excludeAutoConfiguration = EmbeddedMongoAutoConfiguration.class)
    public class ControllerTests {

        @Autowired
        private MockMvc mvc;

        @MockBean
        private CarRepository carRepository;

        @MockBean
        private MongoTemplate mongoTemplatel;

        @Test
        public void testGet() throws Exception {
            short year = 2010;
            given(this.carRepository.findByVin("ABC"))
                    .willReturn(new Car("ABC", "Honda", "Accord", year, 100000, "Red", "Ex-V6"));
            this.mvc.perform(get("/car").param("VIN", "ABC").accept(MediaType.APPLICATION_JSON))
                    .andExpect(status().isOk()).andExpect(content().string("[{\"vin\":\"ABC\",\"make\":\"Honda\",\"model\":\"Accord\",\"year\":2010,\"mileage\":100000,\"color\":\"Red\",\"trim\":\"Ex-V6\",\"type\":null,\"maintenanceTasksList\":[\"Oil Change\",\"Tire Rotation\"]}]"));
        }
    }

您可以在这里找到完整的Spring Boot应用程序,其中包括集成和单元测试。

秦奇
2023-03-14

严格地说,“单元”测试不应该使用Spring。只需像平常一样使用JUnit/TestNG/Spock/which来测试各个类@SpringBootTest用于集成和其他测试。

 类似资料:
  • 需要对项目的控制器部分进行单元测试,但却得到了错误。我相信ModelAndVIew部分导致了这个问题,尽管我曾经嘲弄过它并返回ModelAndVIew,因为它是方法的返回类型。然而,它并不起作用。pom.xml没有任何问题,因此没有添加它。ProjectController: java.lang.IllegalStateException:找不到@SpringBootConfiguration,您

  • 我正在尝试使用Mockito在SprinBoot应用程序中进行一些jUnit测试。 现在我的服务有了一些变量,可以从通过注释: 我试图通过像这样使用来测试这个: 但是,该属性不会被填充,并保持为。 这方面有很多TPOIC,但我还没能拼凑出一个解决方案。我看到解决方案建议,但它似乎想做一个集成测试,使服务加速,但由于无法连接到数据库,服务失败了。所以这不是我想要的。 我还看到一些解决方案建议我制作一

  • 我有一个在命令行上运行的springboot 2应用程序。命令行参数之一是命名中带有batchNo的fileName。我正在使用命令行参数中的fileName设置我application.properties的fileName值。示例 在我的应用程序配置文件中,我像这样从applications.properties文件中读取文件名。 我的目标是能够为每个单独的测试动态设置这个文件名。 示例 如何

  • 我想测试我的SpringBoot应用程序,它使用cassandra作为CrudRepository。我最终得到了 具有 和 这就导致了 如果我使用旧版本的cassandra-unit-Spring 它以NullPointerException结束,因为没有注入值repo。 来源https://github.com/StephanPraetsch/spring.boot.cassandra.unit

  • 共享Api实现类,添加preauthorize-admin,查看所有用户 这是我的JUnit测试,我发送get请求并返回403错误。

  • 我已经创建了一个应用程序使用Springboot和Hibernate,我想配置它的单元测试。 首先,这是DAO接口。 这是DAO接口的实现 然后我创建了一个测试类,如下所示 我已经将application.properties文件放在test和src目录的资源中。 我尝试运行此单元测试用例,但由于以下错误而失败: 那么我可以知道为DAO层配置单元测试的最佳方法吗?

  • 我想配置一个Spring Boot应用程序,以便根本不使用DB。因此,我对应用程序类进行了注释,以排除JPA自动配置类: 原因:org.springframework.beans.factory.BeanCreationException:创建名为“data source”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:无法为测试确

  • 我有一个@Service,我试图在单元测试中嘲笑它,但到目前为止我得到了一个空值。在应用程序类中,我指定什么是scanBasePackages。我必须用不同的方式来做这件事吗?谢谢。 这是我的服务类,它实现了一个接口: 这是我的单元测试。