我在使用@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
这是一个错误:https : //github.com/spring-projects/spring- boot/issues/6541
该修复程序位于spring-data 1.0.2-SNAPSHOT和中2.0.3-SNAPSHOT:https : //github.com/arangodb/spring- data/issues/14#issuecomment-374141173
1.0.2-SNAPSHOT
2.0.3-SNAPSHOT
如果您不使用这些版本,则可以通过声明其名称来模拟它来解决它:
@MockBean(name="myMongoRepository") private MyMongoRepository repository;
回应您的评论
从Spring的文档中:
为了方便起见,需要对启动的服务器进行REST调用的测试可以另外@Autowire一个TestRestTemplate,它将解析到正在运行的服务器的相对链接。
阅读本文,我认为您需要在@SpringBootTestWeb环境中声明:
@SpringBootTest
@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)
如果您的Spring Boot无法启动Web环境,那么需要什么TestRestTemplate。因此,我想spring甚至都无法使用。
TestRestTemplate