2016-09-10 72 views
5

Mam problem z użyciem adnotacji @MockBean. Dokumenty mówią, że MockBean może zastąpić komponent bean w kontekście, ale w moim teście jednostkowym dostaję wyjątek NoUniqueBeanDefinitionException. Nie widzę sposobu korzystania z adnotacji. Jeśli mogę kpić z repozytorium, to oczywiście będzie więcej niż jedna definicja fasoli.Adnotacja MockBean w teście Spring Boot powoduje, że NoUniqueBeanDefinitionException

Mam następujące przykłady znaleźć tutaj: https://spring.io/blog/2016/04/15/testing-improvements-in-spring-boot-1-4

Mam repozytorium Mongo:

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

a zasób 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(); 
    } 
} 

a test 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); 

    } 

} 
Komunikat

Błąd:

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 

Odpowiedz

8

Jest to bug: https://github.com/spring-projects/spring-boot/issues/6541

można obejść przez deklarowania makiety z jego nazwy:

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

W odpowiedzi na Twój komentarz

Fr om Spring's doc:

Dla wygody, testy, które muszą dokonać REST wzywa do rozpoczął serwerze może dodatkowo @Autowire się TestRestTemplate które rozwiązać względne linki do serwera z systemem.

czytając to, myślę, że trzeba zadeklarować @SpringBootTest ze środowiskiem internetowym:

@SpringBootTest(webEnvironment=WebEnvironment.RANDOM_PORT) 

Jeśli bagażnika sprężyna nie rozpocznie środowiska internetowego, to co jest potrzeba TestRestTemplate. Tak więc, wydaje mi się, że wiosna nawet go nie udostępnia.

+0

Dzięki. Próbowałem, a teraz Spring nie może automatycznie wypróbować TestRestTemplate: org.springframework.beans.factory.UnsatisfiedDependencyException: Błąd tworzenia komponentu bean o nazwie "path.to.my.tests.TestMocks": Niezadowolona zależność wyrażona poprzez pole "restTemplate": Brak kwalifikacji komponent bean [org.springframework.boot.test.web.client.TestRestTemplate] znaleziony dla dependency [org.springframework.boot.test.web.client.TestRestTemplate]: oczekiwany co najmniej 1 komponent bean, który kwalifikuje się jako kandydat na agenta dla tej zależności . – JCN

+0

zaktualizował odpowiedź dla TestResttemplate – alexbt

+0

Ah yeah, usunąłem element sieci i zapomniałem. Ponownie go dodałem, a teraz otrzymuję komunikat o braku odpowiedniego HttpMessageConverter dla mojej klasy DTO. Wygląda więc na to, że pominąłem pierwotny błąd i dowiedziałem się o HttpMessageConverters. Dzięki! – JCN