2016-08-18 1 views
0

Мне нужно написать тест модуля для веб-службы в 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(); 
    } 

} 
+0

Какую версию Spring Boot/Spring вы используете? –

+0

1.2.4. Я не буду использовать 1.4 или любую другую версию. – av37

+0

Как выглядит ваш 'Application.class' для подключения сервис-компонента? –

ответ

0

Не уверен, если это будет работать, но на основе других SO сообщений: https://stackoverflow.com/a/32294564/1499549

Похоже, что вы не должны использовать standaloneSetup(), если вы используете бегун.

public void setup() { 
    mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build(); 
} 

Затем удалите @InjectMocks аннотацию и заменить его @Autowired.

//@Mock 
//private GetAddressService getAddressService; 

//@InjectMocks 
@Autowired 
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(){ 
    setUp();  
} 

@Test 
public void test(){ 
    System.out.println("In Unit test"); 
} 
+0

@ShwanClark Я тоже пробовал это раньше, не работал. В этом случае он даже не запускает Тесты.Поскольку я использовал TestExecutionListeners, он начинает искать ProfileValueSourceConfiguration, но не работает после этого. – av37

+0

Я раньше не работал с аннотацией '@ TestExecutionListeners', но на основе документов это похоже на то, что вы на самом деле не используете ни одного слушателя, t определите их в этой аннотации. Я нашел другой ответ SO, который говорит об этом: http://stackoverflow.com/a/27389768/1499549. Мне интересно, следует ли добавить эту аннотация к 'DependencyInjectionTestExecutionListener'? –

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