#java #spring-boot #spring-mvc #integration-testing
#java #весенняя загрузка #spring-mvc #интеграция-тестирование
Вопрос:
Ответ, который я получаю от подачи, пустой, и я не уверен, почему. Я предоставил то, над чем я работал до сих пор. Я следую руководству, цель состоит в том, чтобы просто успокоить контроллер rest, сравнив мою ожидаемую строку с фактической строкой. Большое спасибо за любую помощь.
Вот мое заявление
package com.books.gallo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@SpringBootApplication()
public class BooksRestApplication {
public static void main(String[] args) {
SpringApplication.run(BooksRestApplication.class, args);
}
}
Вот контроллер
package com.books.gallo.resource.impl;
import java.util.Collection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.books.gallo.domain.Book;
import com.books.gallo.resource.Resource;
import com.books.gallo.service.BookService;
@RestController
@RequestMapping("/books")
public class BookResourceImpl implements Resource<Book> {
@Autowired
private BookService bookService;
@GetMapping("/testing")
public String test(){
return String.format("test has run");
}
@Override
public ResponseEntity<Collection<Book>> findAll(){
return new ResponseEntity<>(bookService.findAll(), HttpStatus.OK);
}
@Override
public ResponseEntity<Book> findById(Long id){
return new ResponseEntity<>(bookService.findById(id), HttpStatus.OK);
}
@Override
public ResponseEntity<Book> save(Book book){
return new ResponseEntity<>(bookService.save(book), HttpStatus.CREATED);
}
@Override
public ResponseEntity<Book> update(Book book){
return new ResponseEntity<>(bookService.update(book), HttpStatus.OK);
}
@Override
public ResponseEntity<Book> deleteById(Long id){
return new ResponseEntity<>(bookService.deleteById(id), HttpStatus.OK);
}
}
Вот мой тест
package com.books.gallo.resource.impl;
import com.books.gallo.service.impl.BookServiceImpl;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit.jupiter.SpringExtension;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResu<
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import static org.junit.jupiter.api.Assertions.*;
@ExtendWith(SpringExtension.class)
@WebMvcTest(BookResourceImpl.class)
@ContextConfiguration(classes = {BookServiceImpl.class})
class IntegrationBookResourceImplTest {
@Autowired
private MockMvc mvc;
@Test
void test1() throws Exception {
RequestBuilder request = MockMvcRequestBuilders.get("/books/testing");
MvcResult result = mvc.perform(request).andReturn();
assertEquals("test has run", result.getResponse().getContentAsString());
}
}
This is the error
MockHttpServletRequest:
HTTP Method = GET
Request URI = /books/testing
Parameters = {}
Headers = []
Body = null
Session Attrs = {}
org.opentest4j.AssertionFailedError:
Expected :test has run
Actual :
Update after removal of @ContextConfiguration(classes = {BookServiceImpl.class})
[See Error Image below][1]
[1]: https://i.stack.imgur.com/8pKR8.png
Комментарии:
1. Привет, MGallo 🙂 не могли бы вы также указать класс, в котором можно найти аннотацию @SpringBootApplication (включая имя пакета)?
2. @FluffyDestroyerOfCode просто добавил его в начало моего вопроса
Ответ №1:
Вы неправильно используете аннотацию @ContextConfiguration в классе IntegrationBookResourceImplTest. Эта аннотация используется для загрузки конфигурации spring, которая обычно представляет собой класс, аннотированный с помощью @Configuration . Там вы также добавляете компоненты, которыми вы хотите, чтобы Spring управлял для вас, и т. Д.
Для начала этот пример должен работать:
@ExtendWith(SpringExtension.class)
@WebMvcTest(BookResourceImpl.class)
//@ContextConfiguration(classes = {BookServiceImpl.class}) // this messes up your spring config, here you normally declare spring config classes, which are annotated with @Configuration
class IntegrationBookResourceImplTest {
@Autowired
private MockMvc mvc;
@Test
void test1() throws Exception {
RequestBuilder request = MockMvcRequestBuilders.get("/books/testing");
MvcResult result = mvc.perform(request).andReturn();
assertEquals("test has run", result.getResponse().getContentAsString());
}
}
Вы должны убедиться, что spring знает, как создавать ваши пользовательские компоненты. На данный момент вы можете отредактировать свое BooksRestApplication следующим образом:
@SpringBootApplication
public class BooksRestApplication {
public static void main(String[] args) {
SpringApplication.run(BooksRestApplication.class, args);
}
@Bean
public BookService bookService () {
return new BookService();
}
}
Комментарии:
1. Спасибо, я добавил конфигурацию контекста, потому что в противном случае, когда я запускаю свой тест, моему приложению не удается запустить сообщение im, сообщающее, что контекст моего приложения не загружен. Я только что добавил фотографию с этой ошибкой. Смотрите png в конце исходного сообщения
2. Sry, я обновил свой ответ. Посмотрите на класс BooksRestApplication.