6

Ho un progetto Maven multi-modulo con 2 applicazioni Spring BootCome testare più applicazioni Spring Boot in un test?

genitore

  • fooApp
  • barApp
  • prova

Come impostare un test in cui è possibile caricare applicazioni di avvio a molla separate, ciascuna con il proprio contesto di configurazione, nello stesso processo.

public abstract class AbstractIntegrationTest {//test module 

    protected FOO foo; 
    protected BAR bar; 

    @RunWith(SpringJUnit4ClassRunner.class) 
    @WebAppConfiguration 
    @IntegrationTest 
    @Transactional 
    @SpringApplicationConfiguration(classes = foo.Application.class) 
    public class FOO { 
     public MockMvc mockMvc; 

     @Autowired 
     public WebApplicationContext wac; 

     @Before 
     public void _0_setup() { 
      MockitoAnnotations.initMocks(this); 
      mockMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
      TestCase.assertNotNull(mockMvc); 
     } 

     public void login(String username) { 
     } 
    } 

    @RunWith(SpringJUnit4ClassRunner.class) 
    @WebAppConfiguration 
    @IntegrationTest 
    @Transactional 
    @SpringApplicationConfiguration(classes = bar.Application.class) 
    public class BAR { 

     @Autowired 
     public WebApplicationContext wac; 

     public MockMvc restMvc; 

     @Before 
     public void _0_setup() { 
      MockitoAnnotations.initMocks(this); 
      restMvc = MockMvcBuilders.webAppContextSetup(wac).build(); 
      TestCase.assertNotNull(restMvc); 
     } 

     public void login(String username) { 
     } 
    } 

    @Before 
    public void _0_setup() { 
     foo = new FOO(); 
     bar = new BAR(); 
    } 
} 

E un esempio di un test di integrazione

public class IntegrationTest extends AbstractIntegrationTest { 

    @Test 
    public void login() { 
     foo.login("foologin"); 
     bar.login("barlogin"); 
    } 

} 
+0

partire dalla primavera di avvio di prova 1.5.0 è possibile [presumibilmente] (https://github.com/spring-projects/spring-boot/issues/8000) usare '@ ContextConfiguration' con' @ SpringBootTest'. .. hai provato a usare contesti figlio? –

risposta

0

Dati due pacchetti com.foo.module1, e com.foo.module2 è necessario creare una classe di configurazione per ogni pacchetto. Ad esempio, per Module1:

@SpringBootApplication public class Config1 {} 

Se si desidera eseguire l'applicazione utilizzando solo i fagioli di primavera di un singolo pacchetto è possibile farlo utilizzando la SpringApplicationBuilder. Un frammento di lavoro:

new SpringApplicationBuilder(com.foo.module1.Config1.class) 
    .showBanner(false) 
    .run() 

Questo sarebbe il boot primavera con config1, che solo le ricerche (@ComponentScan è inclusa nel @SpringBootApplication) nel suo pacchetto per i fagioli.

Se si desidera eseguire l'applicazione completa, ad es. tutti e due i moduli contemporaneamente, devi creare una classe di configurazione nei pacchetti superiori com.foo.

Nel caso che è stato menzionato di seguito, dove eseguire i due moduli all'interno di una singola applicazione potrebbe probabilmente interferire l'un l'altro in modo indesiderato a causa di librerie come gli avviatori di avvio a molla, posso solo pensare a due possibilità:

  1. Utilizzando OSGi: che potrebbe non risolvere il problema completamente e potrebbe rivelarsi essere una configurazione complessa abbastanza o
  2. Splitting l'applicazione in due applicazioni e interfacce che creano. Spring Boot è anche una buona scelta per un'architettura Microservice.
+0

Se le mie applicazioni di avvio a molla sono in moduli diversi, come ottenerle in un test? Dovrei usare un terzo "modulo di test di integrazione" che conosca entrambe le applicazioni, ma poi ottengo tutti gli avviatori di queste due applicazioni in un percorso di classe che potrebbe avere effetti collaterali (l'applicazione "A" adotta il comportamento dell'applicazione "B" solo perché ora un iniziatore di dati primaverili è sul percorso). Come ci si confronta? –

+0

Ho adattato la mia risposta alle vostre domande. – rainerhahnekamp

+0

Sì, vedo. Ma questo non mi aiuta. Ovviamente ho già diviso la mia "applicazione" in "microservices". Questo è il motivo per cui voglio testare l'integrazione di entrambe le applicazioni in esecuzione, e che cosa ha sollevato la domanda "come?" innanzitutto. –

Problemi correlati