我正在尝试测试我的春季休假客户,但遇到了麻烦。这是我的客户课程:
@Component
public class MyClient{
private RestTemplate restTemplate;
@Autowired
public MyClient(RestTemplateBuilder restTemplateBuilder,ResponseErrorHandler myResponseErrorHandler) {
this.restTemplate = restTemplateBuilder
.errorHandler(myResponseErrorHandler)
.build();
}
//other codes here
}
这里的
myResponseErrorHandler
是重写handleError
类的hasError
和ResponseErrorHandler
方法的类。现在我的测试课是
@RunWith(SpringRunner.class)
public class MyClientTest {
@InjectMocks
MyClient myClient;
@Mock
RestTemplate restTemplate;
@Mock
RestTemplateBuilder restTemplateBuilder;
//test cases here
}
但是出现以下错误,并且不确定如何解决。
You haven't provided the instance at field declaration so I tried to construct the instance.
However the constructor or the initialization block threw an exception : null
最佳答案
这个问题是因为当您正常运行应用程序时,Spring Boot会自动为您配置RestTemplateBuilder
(因为带有@SpringBootApplication
批注),但是在您的测试中,您没有相应的@SpringBootTest
批注,而MyClient中没有restTemplateBuilder
构造函数当然为null(尝试在其上调用build()方法时会产生错误)。
如果按原样添加它,它将使用应用程序的默认配置上下文,并且RestTemplateBuilder
和MyResponseErrorHandler
都将是工作Bean(请注意,在这种情况下,MyClient
和MyResponseErrorHandler
应该都已配置为Beans)。 -fe用@Component
标记)。
@RunWith(SpringRunner.class)
@SpringBootTest
public class MyClientTest {
@Autowired
private MyClient myClient;
@Mock
private MyResponseErrorHandler myResponseErrorHandler;
@Test
public void sampleTest() throws IOException {
//The example of configuring myResponseErrorHandler behavior
Mockito.when(myResponseErrorHandler.hasError(Mockito.any())).thenReturn(true);
//Call myClient method
//Asserts...
}
}
另外,不要对
RestTemplate
进行任何操作,因为它将在MyClient构造函数中以编程方式创建。另一种方法是创建一个单独的测试配置,您可以在其中获得默认的
RestTemplateBuilder
bean(由Spring提供)和模拟的MyResponseErrorHandler
(用于稍后配置其行为)。它可以让您完全控制如何配置所有bean进行测试而无需使用应用程序上下文。如果您想深入了解它,请按以下步骤操作:
使用
MyResponseErrorHandler
bean创建测试配置类:@TestConfiguration
public class MyClientTestConfiguration {
@Autowired
private RestTemplateBuilder restTemplateBuilder;
@Bean
public ResponseErrorHandler myResponseErrorHandler() {
return Mockito.mock(MyResponseErrorHandler.class);
}
@Bean
public MyClient myClient() {
return new MyClient(restTemplateBuilder, myResponseErrorHandler());
}
}
您的测试课程如下:
@RunWith(SpringRunner.class)
@SpringBootTest(classes = MyClientTestConfiguration.class)
public class MyClientTest {
@Autowired //wired from MyClientTestConfiguration class
private MyClient myClient;
@Autowired //wired from MyClientTestConfiguration class
private MyResponseErrorHandler myResponseErrorHandler;
@Test
public void sampleTest() throws IOException {
//The example of configuring myResponseErrorHandler behavior
Mockito.when(myResponseErrorHandler.hasError(Mockito.any())).thenReturn(true);
//Calling myClient method...
//Asserts...
}
}