当前位置: 首页 > 知识库问答 >
问题:

Spring Boot测试中的MockBean注释导致NoUniqueBeanDefinitionException

东郭骁
2023-03-14

我在使用@mockbean注释时遇到了麻烦。文档说MockBean可以替换上下文中的bean,但我在单元测试中得到了一个NoUniqueBeanDefinitionException。我看不出如何使用注释。如果我可以模拟回购,那么显然会有不止一个bean定义。

public interface MyMongoRepository extends MongoRepository<MyDTO, String>
{
   MyDTO findById(String id);
}
@Component
@Path("/createMatch")
public class Create
{
    @Context
    UriInfo uriInfo;

    @Autowired
    private MyMongoRepository repository;

    @POST
    @Produces(MediaType.APPLICATION_JSON)
    public Response createMatch(@Context HttpServletResponse response)
    {
        MyDTO match = new MyDTO();
        match = repository.save(match);
        URI matchUri = uriInfo.getBaseUriBuilder().path(String.format("/%s/details", match.getId())).build();

        return Response.created(matchUri)
                .entity(new MyResponseEntity(Response.Status.CREATED, match, "Match created: " + matchUri))
                .build();
    }
}
@RunWith(SpringRunner.class)
@SpringBootTest
public class TestMocks {

    @Autowired
    private TestRestTemplate restTemplate;

    @MockBean
    private MyMongoRepository mockRepo;

    @Before
    public void setup()
    {
        MockitoAnnotations.initMocks(this);

        given(this.mockRepo.findById("1234")).willReturn(
                new MyDTO());
    }

    @Test
    public void test()
    {
        this.restTemplate.getForEntity("/1234/details", MyResponseEntity.class);

    }

}

错误消息:

Field repository in path.to.my.resources.Create required a single bean, but 2 were found:
    - myMongoRepository: defined in null
    - path.to.my.MyMongoRepository#0: defined by method 'createMock' in null

共有1个答案

景俊语
2023-03-14

这是一个bug:https://github.com/spring-projects/spring-boot/issues/6541

修复程序位于spring-data1.0.2-snapshot2.0.3-snapshot:https://github.com/arangodb/spring-data/issues/14#issuecomment-374141173

如果您不使用这些版本,则可以通过使用其名称声明mock来解决此问题:

@MockBean(name="myMongoRepository")
private MyMongoRepository repository;

阅读本文,我认为您需要使用web环境声明@springboottest:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)

如果您的Spring Boot没有启动web环境,那么TestRestTemplate有什么需要。因此,我想spring甚至没有提供它。

 类似资料:
  • 我在我的SpringBoot应用程序“demo”中使用了注释样式的Resilience4j。当通过RestTemplate调用外部后端时,我希望使用TimeLimiter并重试以实现以下目标: 将REST调用持续时间限制在5秒-->如果需要更长时间,则使用TimeoutException失败 在TimeoutException上重试-->最多尝试2次 为了查看弹性设置的配置是否如设计的那样工作,我

  • 我有这个类定义 其中保留是一个简单的Pojo ........ 原因:com.fasterxml.jackson.databind.exc.InvalidDefinitionException:找不到类org.mockito.internal.debugging.locationImpl的序列化程序,也找不到创建BeanSerializer的属性(若要避免异常,请禁用SerializationFe

  • 我想配置一个Spring Boot应用程序,以便根本不使用DB。因此,我对应用程序类进行了注释,以排除JPA自动配置类: 原因:org.springframework.beans.factory.BeanCreationException:创建名为“data source”的bean时出错:调用init方法失败;嵌套异常是java.lang.IllegalStateException:无法为测试确

  • TestNG有一个很好的特性,可以将注释添加到测试类中(而不是测试方法)。根据文档,当类被注释时,类上所有公共的void返回方法都被视为测试方法。 更新:现在作为一个问题提出。

  • 我想编写控制器测试,也测试我的注释。到目前为止,我所读到的是,这是一条出路。 当我只有一个控制器可以顺利工作时。然而,当有两个或更多控制器测试类时,@mockbean似乎没有被正确使用。根据测试执行顺序,第一个测试类中的所有测试都会成功,而其他所有测试都会失败。 在下面的测试运行中,首先执行PotatoControllerTest,然后执行FooControllerTest。 我试图用一个通用的来

  • 我想在Spring中测试注入依赖关系。 我想要一个这样的测试: 我尝试过使用ContextConfiguration和一个测试配置文件,但是测试失败了,我不想在测试中使用@autowired,我想创建我的类的一个实例,并且bean是自动autowired的。