2016-08-18 8 views
0

コントローラからのテストを実行し、Serviceクラスへのフローを実行するSpringブートのWebサービスのユニットテストを書く必要があります。 サービスクラスの@Mockアノテーションとコントローラの@InjectMockを使用しているため、アプリケーションフローはServiceクラス内に決して行きません(nullを返します)。書く方法REST Controller Endpointのユニットテストをモックすることなく、Spring起動時のサービスクラス

サービスクラスの@Mockアノテーションがないと、私はヌルポイント例外を受け取ります。

私は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; 

これは私が抽象コントローラのテストクラスと@Testメソッドを持って最後に私のアドレス・コントローラのテストクラスに拡張する抽象テストクラスを持っている私のサービスクラス

@Service 
public class GetAddressServiceImpl implements GetAddressService { 
@Override 
public String getAddress(String id) { 

    System.out.println("ID in Service : " + id); 
    return id; 
} 
} 

です。

Abstarct Testクラス:

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = Application.class) 
public abstract class AbstractTest { 
    } 

Abstarctコントローラテストクラス:

@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); 
} 

アプリケーションイニシャライザ:

@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'はサービスBeanを配線するためにどのように見えますか? –

答えて

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'アノテーションを使用していませんでしたが、ドキュメントに基づいて、実際にはリスナーを利用していないようですそのアノテーションに定義されています。私はそれについて話すもう一つの答えを見つけました:http://stackoverflow.com/a/27389768/1499549。 その注釈に 'DependencyInjectionTestExecutionListener'を追加する必要があるのでしょうか? –

0

ところで、春ブーツは今@MockedBean、アノテーションに基づいてbuilt in support for mocking and spying beansを持っています。たぶんあなたはそれを調べたいでしょう。

+0

ありがとうございますが、私はSpringブート1.4を使用しません – av37

関連する問題