myResponseErrorHandler

myResponseErrorHandler

我正在尝试测试我的春季休假客户,但遇到了麻烦。这是我的客户课程:

@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类的hasErrorResponseErrorHandler方法的类。

现在我的测试课是

    @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()方法时会产生错误)。

如果按原样添加它,它将使用应用程序的默认配置上下文,并且RestTemplateBuilderMyResponseErrorHandler都将是工作Bean(请注意,在这种情况下,MyClientMyResponseErrorHandler应该都已配置为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...
    }
}

08-06 15:21