web-dev-qa-db-ja.com

Spring BootテストのMockBeanアノテーションによりNoUniqueBeanDefinitionExceptionが発生する

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

そして、ジャージーのリソース:

@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
9
JCN

それはバグです: 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-37414117

これらのバージョンを使用していない場合は、モックをその名前で宣言することで回避できます。

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

あなたのコメントに応じて

From Spring's doc

便宜上、起動したサーバーにREST呼び出しを行う必要があるテストでは、実行中のサーバーへの相対リンクを解決するTestRestTemplateを@Autowireで追加できます。

これを読んで、私はあなたが@SpringBootTestをウェブ環境で宣言する必要があると思います:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT)

スプリングブートでWeb環境が起動しない場合は、TestRestTemplateが必要です。したがって、私は春がそれを利用可能にすることさえしないと思います。

13
alexbt

以下をPOM.xmlに追加するだけです

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
0
Snehal Masne