@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
それはバグです: 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
が必要です。したがって、私は春がそれを利用可能にすることさえしないと思います。
以下をPOM.xmlに追加するだけです
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>