Мне нужно написать тест модуля для веб-службы в Spring-boot, который должен выполнять тестирование с контроллера, а также поступать в класс обслуживания. Я использую аннотацию @Mock для класса Service и @InjectMock для контроллера, поэтому поток приложения никогда не входит в класс Service (он возвращает нуль).Как написать единичный тест для конечной точки контроллера REST без смешения Сервисный класс в Spring-boot
Без аннотации @Mock в классе Service, я получаю исключение с нулевой точкой.
Я не хочу издеваться над классом Service, я хочу также проверить класс Service с помощью этого же тестового модуля.
Это мой контроллер REST.
@RestController
public class AddressController {
@Autowired
private GetAddressService getAddressService;
@RequestMapping(value=ApplicationConstant.ADDRESS_URI,method=RequestMethod.G ET,produces = { ApplicationConstant.APP_RESP_TYPE })
public @ResponseBody SampleResponse getAddress(
@RequestParam(value="id",required=true) String hcId,
@RequestParam(value="mbrNbrbr",required=true) String mbrNbr,
){
System.out.println("Request ID in Controller :"+Id);
String responseid = getAddressService.getAddress(Id);
SampleResponse smapleResp = new SampleResponse();
System.out.println("Response ID in Controller :"+Id);
smapleResp.setResponseid(responseid);
return smapleResp;
Это мой класс службы
@Service
public class GetAddressServiceImpl implements GetAddressService {
@Override
public String getAddress(String id) {
System.out.println("ID in Service : " + id);
return id;
}
}
У меня есть абстрактный класс тест, который проходит в тестовом классе Аннотация контроллера и, наконец, мой класс Test Адрес контроллера, которая имеет @test методы. класс
Abstarct Тест:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
public abstract class AbstractTest {
}
Abstarct Test Controller Класс:
@WebAppConfiguration
public abstract class AbstractControllerTest extends AbstractTest {
//mockmvc stimulates Http interactions
protected MockMvc mockMvc;
@Autowired
protected WebApplicationContext webApplicationContext;
protected void setUp(){
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
protected void setUp(AddressController addressController){
mockMvc = MockMvcBuilders.standaloneSetup(addressController).build();
}
}
Наконец Мой адрес Тест Класс:
@TestExecutionListeners
public class AddressMockControllerTest extends AbstractControllerTest {
@Mock
private GetAddressService getAddressService;
@InjectMocks
private AddressController addressController;
private String MockURI ="/v1/legacy/member/Contact/Address? id=55555&mbrNbr=20&id=ABC&productid=1FGQ&sourceid=STAR&addressuid=adasdsa";
@Before
public void setUp(){
MockitoAnnotations.initMocks(this);
setUp(addressController);
}
@Test
public void test(){
System.out.println("In Unit test");
}
@Test
public void testgetAddress() throws Exception {
System.out.println("In Unit test");
MvcResult result = this.mockMvc.perform(
MockMvcRequestBuilders.get(MockURI)
.accept(MediaType.APPLICATION_JSON))
.andReturn();
String content = result.getResponse().getContentAsString();
System.out.println("In Unit test and content is " + content);
}
загрузки Главный класс:
public class Application extends SpringBootServletInitializer{
public static void main(String[] args) {
SpringApplication.run(ApplicationInitializer.class, args);
}
@Override
protected final SpringApplicationBuilder configure(final SpringApplicationBuilder application) {
return application.sources(ApplicationInitializer.class);
}
Применения Initializer:
@Configuration
@EnableAutoConfiguration
@ComponentScan(value={"com.ABC"})
@EnableConfigurationProperties
public class ApplicationInitializer {
@Bean
@ConditionalOnMissingBean(RequestContextListener.class)
public RequestContextListener requestContextListener() {
return new RequestContextListener();
}
@Bean
public ServletRegistrationBean dispatcherRegistration(DispatcherServlet dispatcherServlet) {
ServletRegistrationBean registration = new ServletRegistrationBean(
dispatcherServlet);
registration.addUrlMappings("/");
return registration;
}
@Bean
public ServletRegistrationBean dynamicLogbackLevelServletRegistration() {
return new ServletRegistrationBean(new DynamicLogbackLevelServlet(),"/loglevel");
}
@Order(Ordered.HIGHEST_PRECEDENCE)
public FilterRegistrationBean contextFilterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
RequestFilter contextFilter = new RequestFilter();
registrationBean.setFilter(contextFilter);
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public ApplicationContextProvider applicationContextProvider(){
return new ApplicationContextProvider();
}
}
Какую версию Spring Boot/Spring вы используете? –
1.2.4. Я не буду использовать 1.4 или любую другую версию. – av37
Как выглядит ваш 'Application.class' для подключения сервис-компонента? –