gpt4 book ai didi

rest - 测试时出错 : found multiple declaration of @BootstrapWith for test class

转载 作者:行者123 更新时间:2023-12-03 23:11:56 60 4
gpt4 key购买 nike

我想第一次测试我的 CRUD REST Controller 。我看过一些视频并提出了这个想法,但我遇到了错误。我正在将 JPA 与 mySql 一起使用。 ITodoService 是带有 CRUD 方法的简单接口(interface)。当我通过 Postman 对其进行测试时,我的休息 Controller 正在工作,所以那里的代码是可以的。
如果您能给我一些反馈,可能出了什么问题,我在哪里可以检查有关测试 REST 应用程序的良好信息,因为我花了大约 3 小时没有任何成功:)

    @SpringBootTest
@RunWith(SpringRunner.class)
@WebMvcTest
public class TodoFinalApplicationTests {

@Autowired
private MockMvc mockMvc;


@MockBean
private ITodosService iTodosService;


@Test
public void getAllTodosTest() throws Exception {

Mockito.when(iTodosService.findAll()).thenReturn(
Collections.emptyList()
);

MvcResult mvcResult = mockMvc.perform(
MockMvcRequestBuilders.get("/todos")
.accept(MediaType.APPLICATION_JSON)
).andReturn();

System.out.println(mvcResult.getResponse());

Mockito.verify(iTodosService.findAll());

}
}


Error message:
java.lang.IllegalStateException: Configuration error: found multiple declarations of @BootstrapWith for test class [com.damian.todo_Final.TodoFinalApplicationTests]: [@org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.context.SpringBootTestContextBootstrapper), @org.springframework.test.context.BootstrapWith(value=class org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTestContextBootstrapper)]

EDIT:
This is code for whole CRUD REST Test
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
@SpringBootTest(classes = TodoFinalApplication.class, webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
// @WebMvcTest
public class TodoFinalApplicationTests {

@Autowired
private TestRestTemplate restTemplate;



@LocalServerPort
private int port;

private String getRootUrl() {
return "http://localhost:" + port;
}

@Test
public void contextLoads() {

}



@Test
public void getAllTodos() {

HttpHeaders headers = new HttpHeaders();
HttpEntity<String> entity = new HttpEntity<String>(null, headers);
ResponseEntity<String> response = restTemplate.exchange(getRootUrl() + "/employees",
HttpMethod.GET, entity, String.class);
assertNotNull(response.getBody());

}

@Test
public void createNewTodo() {

Todos todo = new Todos();
todo.setId(5);
todo.setTaskDate("15.01.1990");
todo.setTaskStatus(true);
todo.setTaskDescritpion("Description for testing");

ResponseEntity<Todos> postResponse = restTemplate.postForEntity(getRootUrl() + "/todos", todo, Todos.class);
assertNotNull(postResponse);
assertNotNull(postResponse.getBody());

}

@Test
public void testUpdateTodo() {
int id = 1;
Todos todo = restTemplate.getForObject(getRootUrl() + "/todos/" + id, Todos.class);
todo.setTaskDate("15.01.1990");
todo.setTaskStatus(true);
todo.setTaskDescritpion("Updating");
restTemplate.put(getRootUrl() + "/todos/" + id, todo);
Todos updatedTodo = restTemplate.getForObject(getRootUrl() + "/todos/" + id, Todos.class);
assertNotNull(updatedTodo);


}


@Test
public void testDeletedTodo() {
int id = 3;
Todos todo = restTemplate.getForObject(getRootUrl() + "/todos/" + id, Todos.class);
assertNotNull(todo);
restTemplate.delete(getRootUrl() + "/todos/" + id);
try {
todo = restTemplate.getForObject(getRootUrl() + "/todos/" + id, Todos.class);
} catch (final HttpClientErrorException e) {
assertEquals(e.getStatusCode(), HttpStatus.NOT_FOUND);
}
}

最佳答案

您在一个测试类中同时拥有 @SpringBootTest 和 @WebMvcTest 。除其他外,这两个类仅指定应在测试上下文中实例化哪些 bean。
定义相互冲突,因此只允许使用一个。

决定是否要测试:

  • 整个应用程序上下文 - 使用 @SpringBootTest
  • 仅 Controller - 使用 @WebMvcTest

  • 在你的情况下,我会:
  • 删除@SpringBootTest
  • 在@WebMvcTest
  • 中指定要测试的 Controller

    或者,您可以
  • 删除@WebMvTest
  • 添加 AutoConfigureWebMvc

  • @SpringBootTest 将所有 bean 带入上下文,因此 @WebMvcTest 可能会导致更快的测试。

    关于rest - 测试时出错 : found multiple declaration of @BootstrapWith for test class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379708/

    60 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com