2016-09-10 15 views
5

@MockBean ek açıklama kullanarak sorun yaşıyorum. Dokümanlar, MockBean'ın içerikteki bir fasulyeyi değiştirebileceğini söylüyor, ancak birim testimde bir NoUniqueBeanDefinitionException alıyorum. Notu nasıl kullanacağımı göremiyorum. Repo ile dalga geçebilirsem, o zaman açık bir şekilde birden fazla fasülye tanımı olacaktır. Ben örnekler takip ediyorumSpring Boot sınamasında MockBean açıklamaları NoUniqueBeanDefinitionException neden olur

burada bulunabilir:

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

Ve Jersey kaynak:

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

Ve JUnit test:

https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

Bir Mongo arşivi var

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

    } 

} 

Hata mesajı:

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 

cevap

8

Bir böcek var: https://github.com/spring-projects/spring-boot/issues/6541

Bunu adıyla mock bildirerek etrafında çalışabilirsiniz

: Yorumunuza cevaben

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

Fr om Spring's doc: kolaylık sağlamak için

, DİNLENME ayrıca çalıştıran sunucuya göreli bağlantılar bir TestRestTemplate @Autowire çözecektir hangi başladı sunucuya çağrıları yapmak için gereken testler. Bu okuma

, ben bir web ortamı ile @SpringBootTest ilan etmeye gerek: bahar çizme web ortamını başlamazsa

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 

ardından TestRestTemplate ihtiyacı budur. Böylece, sanırım bahar bunu mümkün kılmıyor bile.

+0

Teşekkürler. Bunu denedim ve şimdi Spring otomatik olarak TestRestTemplate'i ayarlayamaz: org.springframework.beans.factory.UnsatisfiedDependencyException: 'path.to.my.tests.TestMocks' adıyla fasulye yaratılırken hata oluştu: 'restTemplate' alanıyla ifade edilen istenmeyen bağımlılık: Nitelik yok Bağımlılık [org.springframework.boot.test.web.client.TestRestTemplate] türünde [org.springframework.boot.test.web.client.TestRestTemplate] türü fasulye: bu bağımlılık için otomatik bağlantı adayı olarak nitelendirilen en az 1 fasulye bekleniyor . – JCN

+0

, TestResttemplate – alexbt

+0

Ah yeah cevabını güncelledi, webenvironment kısmını kaldırdım ve unuttum. Tekrar ekledim ve şimdi DTO sınıfım için uygun HttpMessageConverter hakkında bir hata alıyorum. Bu yüzden, orijinal hatayı geçmişe ve HttpMessageConverters hakkında bilgi edinmeye başladım. Teşekkürler! – JCN