2017-01-06 42 views
5

Oto mój przypadek testowy dla wiosennej ControllerWiosna Boot Testowanie @WebMvcTest dla kontrolera wydaje się załadować inne kontrolery w kontekście

@RunWith(SpringRunner.class) 
@WebMvcTest(value = MyController.class) 
public class MyControllerTest { 

    @MockBean 
    private MyService myService; 
} 

Więc to jest test jednostki specjalnie dla metod MyController. Ale kiedy uruchomię test, Spring wydaje się rozpocząć tworzenie instancji OtherController i wszystkich jego zależności.

Próbowałem aktualizacji wyżej jako

@RunWith(SpringRunner.class) 
@WebMvcTest(value = MyController.class, excludeFilters = @ComponentScan.Filter(value= OtherController.class, type = FilterType.ANNOTATION)) 


    public class MyControllerTest { 

... 
} 

Ale wiosna wciąż wydaje się go drutu. Oto błąd generowany przez Spring, gdy próbuje utworzyć instancję OtherController, gdy dokładnie wykonam powyższy test.

2017-01-06 12:09:46.207 WARN 18092 --- [   main] o.s.w.c.s.GenericWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'otherController' defined in file [C:\..OtherController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'getOtherService' defined in com.my.myApplication: Unsatisfied dependency expressed through method 'getOtherService' parameter 0org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'getOtherService' defined in com.myOrg.MyServiceApplication: Unsatisfied dependency expressed through method 'getPositionService' parameter 0 

Co może być przyczyną?

+1

Wiem, że minęło trochę czasu, rozwiązałeś to? Czy możesz pokazać MyController i OtherController? – alexbt

Odpowiedz

0

Istnieje prawdopodobieństwo, że uruchamiasz skanowanie fasoli przez przypadek poprzez @Componentscan lub podobieństwo.

Na przykład, jak wyjaśniono w this answer, Spring może wykrywać twoją "produkcję" @SpringBootApplicationApplication ze wszystkimi skanami komponentów, jakie wywołuje. Jeśli tak, upewnij się, że „nadpisać” swój „produkcja” klasę zgłoszenie ze „test” jeden oddanie ...

@SpringBootApplication 
public class Application { 
    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 
} 

... w miejscu, które zostanie zastąpione przez „tworzenie” aplikacji.

Na przykład, jeśli Twój IDE nie zawiedli się wg nazwy klasy starć:

"production" -> src/main/java/com/mycompany/Application.java 
      -> src/main/java/com/mycompany/controllers/MyController.java 
"test"  -> src/test/java/com/mycompany/Application.java 
      -> src/test/java/com/mycompany/controllers/MyControllerTest.java 

Jako alternatywę ja również odkryli, że w moim przypadku to działa tak samo (czyli umieszczenie aplikacji w teście folder kontrolerów)

"production" -> src/main/java/com/mycompany/Application.java 
      -> src/main/java/com/mycompany/controllers/MyController.java 
"test"  -> src/test/java/com/mycompany/controllers/Application.java 
      -> src/test/java/com/mycompany/controllers/MyControllerTest.java