一尘不染

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

spring-boot

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

我正在关注在这里找到的示例:https : //spring.io/blog/2016/04/15/testing-improvements-in-
spring-boot-1-4

我有一个mongo存储库:

public interface MyMongoRepository extends MongoRepository<MyDTO, String>
{
   MyDTO findById(String id);
}

还有Jersey资源:

@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();
    }
}

和一个JUnit测试:

@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

阅读 764

收藏
2020-05-30

共1个答案

一尘不染

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

该修复程序位于spring-data
1.0.2-SNAPSHOT和中2.0.3-SNAPSHOThttps : //github.com/arangodb/spring-
data/issues/14#issuecomment-374141173

如果您不使用这些版本,则可以通过声明其名称来模拟它来解决它:

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

回应您的评论

Spring的文档中

为了方便起见,需要对启动的服务器进行REST调用的测试可以另外@Autowire一个TestRestTemplate,它将解析到正在运行的服务器的相对链接。

阅读本文,我认为您需要在@SpringBootTestWeb环境中声明:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)

如果您的Spring Boot无法启动Web环境,那么需要什么TestRestTemplate。因此,我想spring甚至都无法使用。

2020-05-30