如何在使用 MongoDB 时为存储库编写集成测试时使 RestTemplet 可用

问题描述 投票:0回答:1

我正在尝试使用 @DataMongoTest 和 findById 为我的 MongoRepository 编写集成测试,并检查文档是否具有某些值,但问题在于我在项目中使用的 RestTemplet。即使我给了它 MainTest 类,它也无法绑定restTemplet。下面是详细内容。

我可以使用本地配置运行此应用程序,并且能够从 MongoDB 接收数据。我们在另一个服务类中使用这个restTemplate bean来在调用MongoDB之前调用一些后端

我的主课

@SpringBootApplication
public class User{
  public static void main(String[] args){
     SpringApplication.run(User.class,args);
    }

@Bean
public RestTemplet restTemplet(RestTemplateBuilder builder){return builder.buil();}
}

我的 Mongo 存储库

这里我的 Document 对象是 Response,Id 是字符串类型

@Repository
public interface AccountRepository extends CurdRepository<Response, String>

我的主要测试课

我已经将 bean 实现为主类,以防万一认为它可以从这里参考。但它没有参考这里

@SpringBootTest
class UserManagementTest{

@Test
void contextLoads(){}

@Bean
public RestTemplet restTemplet(RestTemplateBuilder builder){return builder.buil();}

这是我的存储库测试

@DataMongoTest
public class AccountRepositoryMongoIT{

  @Autowired
  AccountRepository repo;

  Response response = new Response();
  @BeforeEach
  void setUp(){
   response.setId("1234");
   response.setSomeValue("abcd")
   }
 @Test
 public void test_GetAccountByID() {
  assertEqual(response.getSomeValue(), repo.findById(id).get().getSomeValue());
 }
}

但是当我运行这个时,它失败了

UnsatisfiedDependencyException: Error creating bean with name 'restTemplate' defined in com.java.user.User.....

有没有一种方法可以在不使用 @SprringBootTest 注解的情况下运行它,因为我们不想启动整个容器?我们只是想测试这个仓库的轻量级

如果我在这里遗漏了什么,请告诉我

java mongodb spring-boot spring-boot-test
1个回答
0
投票

当使用切片

@DataMongoTest
注释时,Spring Test 将扫描您的主 Spring Boot 类(示例中的
User
)并将其用于切片上下文初始化。

当您定义需要

RestTemplate
(通过方法参数注入)的
RestTemplateBuilder
bean 时,您的上下文启动会失败,因为此构建器不是您使用
@DataMongoTest
获得的切片上下文的一部分。然而,它在启动整个上下文时可用,这就是它与
@SpringBooTest
一起使用的原因。

解决方案:从主类中移出所有 bean 定义。在您的示例中,您可以将

RestTempalte
创建外包给,例如一个
RestTemplateConfig

@Configuration
class RestTemplateConfig {
  
  @Bean
  public RestTemplet restTemplet(RestTemplateBuilder builder){return builder.buil();}
}
© www.soinside.com 2019 - 2024. All rights reserved.