2016-02-24 4 views
0

Существует микросервис, выполненный с использованием Spring Boot. Он состоит из Jetty, Jersey, Jackson и Liquibase. Одной из задач этой службы является получение некоторых данных через REST и обратный ответ. Эта операция проходит через следующие единицы:Тестирование Весенняя обувь Проблемы с ресурсами REST

  • MyResource, @Component REST с JAX-RS аннотаций, который принимает данные и попросить @Autowired MyService для ответа.
  • MyService, @Component сервис с @Autowired MyResource, чтобы попросить его ответить.
  • MyResource, простой интерфейс @JpaRepository

Это приложение работает отлично, но теперь мне нужно добавить несколько тестов для каждого модуля. Обычно я использую Mockito для тестирования единиц, поэтому я тестирую свое обслуживание с издевательством MyRepository (метод Mockito @Mock annotation + when()). Я хочу проверить MyResource.java таким же образом.

Я пытался использовать TestRestTemplate способ тестирования с пружинным загрузки стартер-тест и мой тестовый класс выглядит следующим образом:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
@WebIntegrationTest(randomPort = true) 
public class MyResourceTest { 
    @Value("${local.server.port}") 
    private int port; 

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

    @Test 
    public void test() { 
    final TestRestTemplate restTemplate = new TestRestTemplate(); 
    assertEquals(restTemplate.postForEntity(getBaseUrl() + "/test", null, ResponseObject.class).getBody(), new ResponseObject()); 
    } 
} 

И есть две проблемы. Сначала - когда мой тест запущен, они запускают все весеннее приложение, поэтому мои скрипты linibase пытаются найти базу данных, и это очень длительный процесс. Во-вторых - я не могу заменить класс MyService прокси-сервером Mockito.

Я попытался найти руководство по лучшим методам тестирования приложений REST для загрузки весеннего ботинка, и я нашел способ, основанный на MockMvc, но, похоже, не запускайте сервер для запуска теста. Можете ли вы поделиться своим опытом тестирования ресурса REST весной?

+0

В пуль 2 и 3, не значит 'MyRepository'? –

ответ

2

MockMvc - предпочтительное решение проблемы. Он запускает приложение загрузки весны, но «издевается» над запросом, поэтому он действительно не запускается через http, а ведет себя как таковой. Вы можете получить все бобы вашего приложения, введенные в ваш тестовый класс, с помощью @Autowired, чтобы вы могли издеваться над весенними бобами.

+0

В JAX-RS есть проблема. MockMvc не работает с JAX-RS = ( – finnetrolle

1

Я выполняю все свои тесты по 6 классам конфигурации/поддержки.

AbstractTest настроить ядро ​​тестов

@ActiveProfiles(resolver = TestActiveProfilesResolver.class) 
@RunWith(SpringJUnit4ClassRunner.class) 
@WebAppConfiguration 
@IntegrationTest 
@SpringApplicationConfiguration(classes = Application.class) 
public abstract class AbstractTest { 
    ... 
} 

AbstractRepositoryTest, чтобы проверить мои репозитории JDBC + jdbi

@Transactional 
public abstract class AbstractRepositoryTest<R> extends AbstractTest implements Repositories { 

    @Inject 
    private ObjectMapper mapper; 

    @Inject 
    protected Repositories repositories; 

    private final Class<R> repositoryType; 

    ... 
} 

AbstractServiceTest, чтобы проверить свои услуги, этот класс содержит ядро теста моей службы

public abstract class AbstractServiceTest { 
    ... 
} 

AbstractIntegrationTest содержит ядро ​​моих тестов интеграции, методы Utils для тестирования диспетчерского и т.д.

public abstract class AbstractIntegrationTest extends AbstractTest { 
    ... 
} 

Применение обеспечивает AbstractTest контекст для запуска тестов, это Classe такой же класс, который я использую для запуска моей весны загрузки приложения

@SpringBootApplication 
public class Application extends SpringBootServletInitializer { 
    public static void main(final String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @Override 
    protected SpringApplicationBuilder configure(final SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 
    ... 
} 

И finnaly TestActiveProfilesResolver , которые предоставляют профиль в соответствии с application-test.properties, Это необходимо, потому что существует открытая проблема на JIRA, here

public class TestActiveProfilesResolver implements ActiveProfilesResolver { 

    @Override 
    public String[] resolve(final Class<?> testClass) { 
     final String activeProfile = System.getProperty("spring.profiles.active"); 
     return new String[] {activeProfile == null ? "test" : activeProfile}; 
    } 

} 

Иногда мои тесты продлить AbstractRepositoryTest, AbstractIntegrationTests или AbstractServiceTest, это зависит от того, что я хочу. Эта конфигурация решил все мои проблемы, чтобы проверить услуги, контроллеры и т.д.

Смежные вопросы