无法自动连线 RestTemplate 以进行单元测试



我有一个使用自动连线实例的服务,如下所示RestTemplate

@Service
class SomeAPIService {
    private RestTemplate restTemplate;
    SomeAPIService(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
        this.restTemplate.setRequestFactory(HttpUtils.getRequestFactory());
    }
}

在非测试环境中一切运行良好。但是当我尝试在测试配置文件中运行以下单元测试时,它开始抱怨无法自动连接 rest 模板。

@RunWith( SpringJUnit4ClassRunner.class )
@SpringBootTest(classes = MyApplication.class, webEnvironment = RANDOM_PORT, properties = "management.port:0")
@ActiveProfiles(profiles = "test")
@EmbeddedPostgresInstance(flywaySchema = "db/migration")
public abstract class BaseTest {
}
@SpringBootTest(classes = SomeAPIService.class)
public class SomeAPIServiceTest extends BaseTest {
    @Autowired
    SomeAPIService someAPIService;
    @Test
    public void querySomeAPI() throws Exception {
        String expected = someAPIService.someMethod("someStringParam");
    }
}

以下是详细的例外情况 -

引起: org.springframework.beans.factory.UnsatisfiedDependencyException: 创建名为"someAPIService"的 Bean 时出错:未满足的依赖项 通过构造函数参数 0 表示;嵌套异常是 org.springframework.beans.factory.NoSuchBeanDefinitionException: No 类型为"org.springframework.web.client.RestTemplate"的限定 bean 可用:预计至少 1 个符合自动连线条件的 Bean 候选人。依赖项注释:{}

有什么线索吗?

以下帮助我自动连接了正确的依赖项。解决方案是还将RestTemplate.class包含在提供给SpringBootTest的类列表中。

@SpringBootTest(classes = {RestTemplate.class, SomeAPIService.class})
class SomeAPIService {
    @Autowired
    SomeAPIService someAPIService;
    @Test
    public void querySomeAPI() throws Exception {
        String expected = someAPIService.someMethod("someStringParam");
    }
}

@Emre答案有助于指导我找到最终解决方案。

您正在尝试自动连接 SomeAPI 服务而不满足其依赖项。您应该将 Rest Template 注入到 SomeAPI 服务中。但是你得到了 NoSuchBeanDefinitionException for Rest Template。

看看如何注入它:

如何使用注释自动连接 RestTemplate

另一种答案是 - 使用TestRestTemplate

来自官方文档>>>

TestRestTemplate可以直接在集成测试中实例化,如以下示例所示:

public class MyTest {
    private TestRestTemplate template = new TestRestTemplate();
    @Test
    public void testRequest() throws Exception {
        HttpHeaders headers = this.template.getForEntity(
                "https://myhost.example.com/example", String.class).getHeaders();
        assertThat(headers.getLocation()).hasHost("other.example.com");
    }
}

或者,如果将@SpringBootTest注释与 WebEnvironment.RANDOM_PORTWebEnvironment.DEFINED_PORT 一起使用,则可以注入完全配置的TestRestTemplate并开始使用它。如有必要,可以通过 RestTemplateBuilder Bean 应用其他自定义。

相关内容

  • 没有找到相关文章