gpt4 book ai didi

java - 构造函数中模拟 bean 的 NullPointerException - 如何通过首先自定义构造函数来正确模拟模拟 Bean?

转载 作者:行者123 更新时间:2023-12-02 10:23:42 25 4
gpt4 key购买 nike

我在 WebClient.Builder 实例的测试类中使用 @MockBean 注释,当我尝试设置 SSL 上下文时,它会导致 NullPointerException。

我不知道为什么当我没有尝试设置上下文并简单地调用 build() api 时没有看到错误,如下 v1 所示:

服务类 v1:

@Service
public class ABCD {

private static final Logger logger = LoggerFactory.getLogger(ABCD.class);

private String apiUrl;

private final WebClient webClient;
private final XYZRepository repository;

public ABCD(WebClient.Builder webClientBuilder,
XYZRepository repository, @Value("${api-root-url}") String apiUrl) {

//------------------------
this.webClient = webClientBuilder.build();
//------------------------
this.repository = repository;
this.apiUrl = apiUrl;
}
}

服务类 v2:

@Service
public class ABCD {

private static final Logger logger = LoggerFactory.getLogger(ABCD.class);

private String apiUrl;

private final WebClient webClient;
private final XYZRepository repository;

public ABCD(WebClient.Builder webClientBuilder,
XYZRepository repository, @Value("${api-root-url}") String apiUrl) throws SSLException {

SslContext sslContext = SslContextBuilder
.forClient()
.trustManager(InsecureTrustManagerFactory.INSTANCE)
.build();
ClientHttpConnector httpConnector = new ReactorClientHttpConnector(options -> options.sslContext(sslContext));

//------------------------
this.webClient = webClientBuilder
.clientConnector(httpConnector)
.build();
//------------------------
this.repository = repository;
this.apiUrl = apiUrl;
}
}

测试类:

@RunWith(SpringRunner.class)
@WebFluxTest(ABCD.class)
public class ABCDTest {

@MockBean
XYZRepository repository;

@MockBean
WebClient.Builder webClientBuilder;

@SpyBean
ABCD ABCDService;


WebClient webClient;

@Value("${api-root-url}")
String apiRootUrl;

@Before
public void setup() {
this.objMapper = new ObjectMapper();
this.mockWebServer = new MockWebServer();
String baseUrl = this.mockWebServer.url("/").toString();
this.webClient = WebClient.create(baseUrl);

MockitoAnnotations.initMocks(this);
ReflectionTestUtils.setField(ABCDService,
"apiRootUrl", API_ROOT_URL);
ReflectionTestUtils.setField(ABCDService,
"webClient", this.webClient);
}

}

这里是 v2

this.webClient = webClientBuilder .clientConnector(httpConnector) .build();

build() 调用上导致 NPE。如何在不导致 NPE 的情况下模拟 Web 客户端?

我尝试在 setup() 方法中添加以下代码来模拟 clientConnector 方法的响应:

when(this.webClientBuilder.clientConnector(any()))
.thenReturn(this.webClientBuilder);

所以,我很好奇可以在哪里添加这段代码来使用上面的模拟。

最佳答案

我认为 webClientBuilder 已作为模拟创建成功(它不是空的 - 是吗?),但是您还没有告诉该模拟当 clientConnector< 时要做什么 方法被调用。因此,Mockito 的默认行为是返回 null - 因此,当您对该响应调用 build() 时,您的 NPE 就会返回。

因此,您需要 webClientBuilderclientConnector 方法返回自身,并从 build 返回 webClient ()。通过添加以下行来完成此操作:

when(webClientBuilder.clientConnector(any(ClientHttpConnector.class))).thenReturn(webClientBuilder);
when(webClientBuilder.build()).thenReturn(webClient);

关于java - 构造函数中模拟 bean 的 NullPointerException - 如何通过首先自定义构造函数来正确模拟模拟 Bean?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54138067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com