Spring boot 1.4 Testing: Configuratiefout: meerdere verklaringen van @BootstrapWith gevonden

Door het officiële document hier te volgen:
http://docs.spring.io/ spring-boot/docs/1.4.0.M2/reference/htmlsingle/#Testing

ik wilde een van mijn REST API-methoden als volgt testen:

@RunWith(SpringRunner.class)
@WebMvcTest(LoginController.class)
@SpringBootTest(classes = Application.class)
public class AuthorizationServiceTest {
    @Autowired
    private TestRestTemplate restTemplate;
    @Test
    public void test() {
        Object returnedObject=his.restTemplate.getForObject("/login", Object.class);
    }
}

Zoals vermeld in het document:

Het zoekalgoritme werkt op vanaf het pakket dat de test bevat
totdat het een @SpringBootApplication of @SpringBootConfiguration . vindt
geannoteerde klas. Zolang je je code op een verstandige manier hebt gestructureerd
manier waarop uw hoofdconfiguratie gewoonlijk wordt gevonden.

Ik heb mijn code goed gestructureerd (denk ik tenminste):

AuthorizationService: valt onder pakket com.xxx.yyy.zzz.authorization;

AuthorizationServiceTest: valt onder pakket com.xxx.yyy.zzz.authorizationTest;

Ik krijg deze uitzondering (Full Trace):

java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [com.orangeraid.rasberry.gateway.authorizationTest.AuthorizationServiceTest]: [@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.context.SpringBootTestContextBootstrapper)]
    at org.springframework.test.context.BootstrapUtils.resolveExplicitTestContextBootstrapper(BootstrapUtils.java:155)
    at org.springframework.test.context.BootstrapUtils.resolveTestContextBootstrapper(BootstrapUtils.java:126)
    at org.springframework.test.context.TestContextManager.<init>(TestContextManager.java:105)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.createTestContextManager(SpringJUnit4ClassRunner.java:152)
    at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.<init>(SpringJUnit4ClassRunner.java:143)
    at org.springframework.test.context.junit4.SpringRunner.<init>(SpringRunner.java:49)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:104)
    at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:86)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26)
    at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59)
    at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createUnfilteredTest(JUnit4TestLoader.java:84)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.createTest(JUnit4TestLoader.java:70)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestLoader.loadTests(JUnit4TestLoader.java:43)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:444)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)

Help me alsjeblieft hiermee, ik heb al meer dan 2-3 uur doorgebracht zonder enig geluk.

Bedankt.


Antwoord 1, autoriteit 100%

Deze uitzondering treedt op wanneer de lentetest de hoofdconfiguratieklasse niet kan vinden.
Probeer @ContextConfiguration-aantekening toe te voegen aan uw testklasse. Volg de voorjaarstestdocumentatie voor meer details (sectie Testconfiguratie detecteren)

Mijn voorbeeldtestklasse is als volgt:

@RunWith(SpringRunner.class)
@ContextConfiguration(classes=Application.class)
@WebMvcTest(MyController.class)
public class MyConrollerTests {
    ...
}

Antwoord 2, autoriteit 58%

Verwijder gewoon de @SpringBootTest en alles werkt prima. Ik had hetzelfde probleem met het gebruik van @SpringBootTest en @DataJpaTest, deze fout trad op toen ik de bovenliggende springboot-versie pom.xml opwaardeerde naar 2.1.0, zoals hieronder. Toen ik versie 2.0.5 gebruikte, trad deze fout niet op.

@RunWith(SpringRunner.class)
//@SpringBootTest//(classes = KalahApplication.class)
// DataJpaTest supports rollback after running every test case
@DataJpaTest
public class GameRepositoryTest {

pom.xml

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
   </parent>

Antwoord 3, autoriteit 32%

Ik weet dat het te laat is om deze vraag te beantwoorden, maar het kan iemand in de toekomst helpen, dus… Ik had hetzelfde probleem en na wat onderzoek ontdekte ik dat er geen @WebMvcTestals er @SpringBootTestis. dus verwijder gewoon @WebMvcTesten @SpringBootTestdoet de rest.


Antwoord 4, autoriteit 15%

Het gebeurt omdat je zowel @WebMvcTest als @SpringBootTest hebt opgegeven, ik los hetzelfde probleem op door @SpringBootTest te verwijderen


Antwoord 5

Ik hoop dat dit zal helpen. Het werkte voor mij nadat ik het van @SpringBootTest had gehaald, en ik was later het web aan het testen voor dezelfde @AutoWired die een fout zou geven als ik de interface had gebruikt. Liever bespotten hetzelfde het werkte.

package com.naveen.productreview;
import static org.hamcrest.Matchers.containsString;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import com.naveen.productreview.service.IProductReviewService;
@RunWith(SpringRunner.class)
@WebMvcTest
//@SpringBootTest
public class WebLayerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private IProductReviewService productReviewService; 
    @Test
    public void shouldReturnDefaultMessage() throws Exception {
        this.mockMvc.perform(get("/api/product-review")).andDo(print()).andExpect(status().isOk())
        .andExpect(content().string(containsString("Naveen"))); 
    }
}

Antwoord 6

Het lijkt erop dat u een integratietest wilt schrijven. Daarom raad ik aan om alleen te gebruiken

@SpringBootTest(classes = Application.class)

Als je junit4 wilt gebruiken, voeg dan toe

@RunWith(SpringRunner.class)

Antwoord 7

in Junit 5 zou kunnen zijn:

@ExtendWith(SpringExtension.class)
@DataJpaTest
class DeliveryRepositoryTest {
    @Autowired
    private DeliveryRepository repository;
    ...
}

Antwoord 8

Ik had een soortgelijk probleem met deze configuratie:

@WebMvcTest
@SpringBootTest
@ContextConfiguration(classes = {Controller.class})
public class ControllerTest {
    @Autowired
    private MockMvc mockMvc;
...}

en ik heb een Spring-servicebean automatisch bedraad in de controller.

De uiteindelijke juiste instelling is om gewoon @WebMvcTestte laten, die de MockMvc levert, en een @MockBeantoe te voegen voor de service.
Mijn laatste, werkende, test is:

@WebMvcTest(Controller.class)
public class ControllerTest {
    @Autowired
    private MockMvc mockMvc;
    @MockBean
    private CustomerService customerService; 
...}

Antwoord 9

U mag alleen @DataJpaTestgebruiken.
Verwijder @SpringBootTestin uw Testclass

Other episodes