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

使用TestRestTemplate进行SpringBoot测试是否总是需要@SpringBootTest注释

汪建德
2023-03-14
@WebMvcTest(MyController.class)
class MyControllerSpec extends Specification {

@Autowired
MockMvc mockMvc;

def "test"() {
   def mockRequest = "something"

   when: "we make call"
   def response = mockMvc.perform(post("/getuser")
            .contentType(MediaType.APPLICATION_JSON)
            .content(mockRequest))
            .andReturn().response

   then: "we get response"
   response.status == OK.value()
   }
}
Unable to start EmbeddedWebApplicationContext 
due to missing EmbeddedServletContainerFactory bean

我使用TestRestTemplate的测试代码:

@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT, 
                classes = [TestConfigure.class])
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
class  MyControllerSpec extends Specification {

@LocalServerPort
private int port;

@Autowired
TestRestTemplate restTemplate

private String createURLWithPort(String uri) {
    return "http://localhost:" + port + uri;
}

def "Integration Success Senario"() {

    given: ""
    when: "we try to get a user using a rest call"

    def request = new User(name, address)

    String jsonResponse = 
       restTemplate.postForObject(createURLWithPort("/getuser"), 
                                  request, String.class)

    .....
   }
 }

共有1个答案

丌官玺
2023-03-14

该错误只是告诉您,集成测试缺少一个用于运行测试中的web服务的servlet容器。您只需要以某种方式配置这个容器。您可以手动执行,也可以允许Spring以与使用@SpringBootApplication@EnableAutoConfiguration时相同的方式执行。因此,只需将@enableAutoConfiguration放在集成测试类上,或者通过在测试内部声明一个静态类来创建测试配置,并在其上标记put the annotation。正如评论中所建议的,以下假设是错误的

看来我必须为所有bean创建一个testconfigure.class...

下面是没有任何用户定义bean的工作示例,其中Spring只返回404用于不存在的方法

@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_EACH_TEST_METHOD)
class MyControllerSpec extends Specification {
    @LocalServerPort
    private int port

    @Autowired
    TestRestTemplate restTemplate

    def "Integration Success Senario"() {
        given: ""
        def request = new User("name", "address")

        when: "we try to get a user using a rest call"
        def response = restTemplate.postForObject(createURLWithPort("/getuser"), request, Map.class)

        then:
        response.status == 404

    }

    private String createURLWithPort(String uri) {
        return "http://localhost:" + port + uri
    }

    @EnableAutoConfiguration //it configures the servlet container
    @Configuration
    static class TestConfig {

    }
}
 类似资料:
  • 我正在springboot应用程序中编写Junits,它只有一个初始化器类 以及其他控制器和服务类。 服务类的Junit如下所示: 当我运行Junit时,它会抛出如下错误: 我还尝试了所有注释,如,@ContextConfiguration(classes=Initializer.class),,但它仍会抛出相同的错误。代码中没有其他类似于应用程序上下文的配置类。

  • 我的目标是将以前使用Spring Boot 1.3开发的Spring Boot应用程序迁移到最新的Spring Boot 1.4版本。该应用程序由几个maven模块组成,其中只有一个包含用SpringBootApplication注释的类。 迁移的一部分是使用WebMvcTest注释来有效地测试控制器,这里我遇到了一个问题。 考虑Spring Boot github页面中的一个示例应用程序<代码>

  • 问题内容: 我们有一些Hibernate getter方法,它们都用和标注。 如果没有相应的设置器,则会出现异常。为什么是这样? 在我们的例子中,我们派生了从getter返回的值(将其存储在DB中),而setter没有任何功能目的。因此,我们只有一个空方法可以解决错误情况。 问题答案: 正如其他人提到的那样,如果您注释属性getter方法,则Hibernate在从数据库读取值时会使用setter。

  • 可以通过以下方式创建上下文: null null 或者我使用SpringBoot,有@SpringBootApplication a是添加以下所有内容的方便注释: @Configuration将类标记为应用程序上下文的bean定义的源。@EnableAutoConfiguration告诉Spring Boot根据类路径设置、其他bean和各种属性设置开始添加bean。通常情况下,您会为Spring

  • 我使用testAd ID(ca-app-pub-3940256099942544/1033173712)从admob不是我的admob ID,我需要使用addTestDevice()太,而在移动设备测试?它甚至显示了测试广告屏幕,而不是实时广告。 因为我这样做了,我整天都在使用我的应用程序进行测试,晚上我收到了账户暂停邮件。

  • 问题内容: 是否需要进行显式的if(log.isDebugEnabled()){…}检查? 我的意思是,我已经看到一些帖子提到log.debug(“something”)进行隐式调用,以查看调试模式日志记录是否已启用,然后再进行日志记录。我是否缺少某些东西,或者在使用此步骤之前有中间步骤要执行? 谢谢! 与 编辑:在上面写过:http : //java.sg/whether-to-do-a-isd