Внедрение тестовой реализации сервиса в конечную точку REST для тестирования JUnit - PullRequest
0 голосов
/ 30 января 2019

Я занимаюсь разработкой приложения REST и хочу выполнить тестирование JUnit, чтобы внедрить тестовую реализацию службы в мой ресурс (конечная точка)

DocumentProviderApplication

package com.coriaedu.documentprovider;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class DocumentProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(DocumentProviderApplication.class, args);
    }
}

Я использую Spring Boot иДжерси 2.27.У меня есть одна конечная точка DocumentProviderResource , которая опирается на внедренную DocumentManager реализацию.

DocumentProviderResource

package com.coriaedu.documentprovider.service;

import javax.inject.Inject;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.springframework.stereotype.Component;

import com.coriaedu.documentprovider.interfaces.DocumentManager;

@Component
@Path("/documents")
public class DocumentProviderResource {

    @Inject
    DocumentManager manager;

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public Response getDocumentLocation(@QueryParam("id") String docId) {
        return Response.ok(manager.getDocumentLocation(docId)).build();
    }
}

Я создал ProductionConfiguration класс для настройки bean-компонента, который будет введен во время производства.Эта ExternalDocumentManager реализация подходит для производства, но не для разработки.

package com.coriaedu.documentprovider.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import com.coriaedu.documentprovider.managers.ExternalDocumentManager;

@Configuration
public class ProductionConfiguration {

    @Bean
    public ExternalDocumentManager manager() {
        return new ExternalDocumentManager("init_data");
    }
}

В моем модульном тесте я использую springboot TestRestTemplate для тестирования приложения, но я делаюне знаю, как внедрить другую реализацию DocumentManager в мой ресурс для этих тестов ... он все еще внедряет ExternalDocumentManager .

package com.coriaedu.documentprovider;

import static org.assertj.core.api.Assertions.assertThat;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.context.SpringBootTest.WebEnvironment;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;

import com.coriaedu.documentprovider.interfaces.DocumentManager;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT)
public class DocumentProviderApplicationTests {

    @Autowired
    private TestRestTemplate restTemplate;

    @MockBean // this works... but I want to use a test implementation instead of a Mockito implementation.
    DocumentManager manager;

    @Test
    public void simple_test() {
        ResponseEntity<String> entity = this.restTemplate.getForEntity("/documents", String.class);
        assertThat(entity.getStatusCode()).isEqualTo(HttpStatus.OK);
    }
}

Я пытался создать отдельный TestConfiguration класс с TestDocumentManager реализацией DocumentManager , но он все еще не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...