Я занимаюсь разработкой приложения 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 , но он все еще не работает.