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 @WebMvcTest
als er @SpringBootTest
is. dus verwijder gewoon @WebMvcTest
en @SpringBootTest
doet 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 @WebMvcTest
te laten, die de MockMvc levert, en een @MockBean
toe 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 @DataJpaTest
gebruiken.
Verwijder @SpringBootTest
in uw Testclass