0

我已经构建了一个 Spring WebFlux 应用程序(带注释的控制器模型),它与具有以下提到的库版本的谷歌云服务集成。我已经为 Controller 类编写了一个测试,当它在我的本地机器上运行时,它运行没有任何问题。但是当在 Jenkins 管道上运行相同的测试时,它会抛出Binder has not been registered错误。

Spring Boot 版本 - 2.5.5
Spring Cloud GCP 版本 - 2.0.4

在 Jenkins 控制台上打印的错误如下

[ERROR] com.test.controller.ControllerTest.shouldPostRequestToEndpoint  Time elapsed: 0.001 s  <<< ERROR!
java.lang.IllegalStateException: Failed to load ApplicationContext
Caused by: java.lang.IllegalStateException: org.springframework.boot.context.properties.bind.Binder has not been registered

最令人困惑的是这个问题只发生在 Jenkins 实例上,而不是我的本地机器上,这使得调试变得非常困难。我不确定为什么会这样。另外,不确定如何在此处注册任何 Binder。如果我能获得有关问题可能出在哪里或如何调试的任何帮助/指导,那将非常有帮助。

示例 Controller 和 ControllerTest 类可以在下面找到。

控制器.java

@RestController
public class Controller {

    private final Service service;

    @Autowired
    public Controller(Service service) {
        this.service = service;
    }

    @PostMapping("/test")
    public Mono<String> test() {
        return service.test(LocalDateTime.now())
                .then(Mono.just("SUCCESS"));
    }
}

控制器测试.java

@WebFluxTest(controllers = Controller.class)
public class ControllerTest {

    @MockBean
    Service service;
    
    @Autowired
    WebTestClient webTestClient;

    @Test
    public void shouldPostRequestToEndpoint() {
        given(service.test(any(LocalDateTime.class))).willReturn(empty());
        webTestClient
                .post()
                .uri("/test")
                .exchange()
                .expectStatus().isOk()
                .expectBody(String.class);
    }
}

即使你们指出我要确定哪些 Binder 需要注册,那也很棒。

提前致谢!

4

1 回答 1

0

看起来弹簧上下文无法加载。您的 JUnit 版本在本地和 CI 之间是否不同?如果您使用 JUnit4,请尝试添加@RunWith(SpringRunner.class)到您的测试中。

于 2021-11-24T18:04:14.300 回答