我正在尝试使用 @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 注解的情况下运行它,因为我们不想启动整个容器?我们只是想测试这个仓库的轻量级
如果我在这里遗漏了什么,请告诉我
当使用切片
@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();}
}