2016-02-02 42 views
1
的Mockito我

想測試我的卡塔西斯ResourceRepository(卡塔西斯彈簧2.1.7)中配置的行爲:測試卡塔西斯JsonApi與MockMvc和

import io.katharsis.queryParams.QueryParams; 
import io.katharsis.repository.ResourceRepository; 
import org.springframework.stereotype.Component; 

@Component 
public class UserResourceRepository implements ResourceRepository<UserDTO, String> { 

    @Autowired 
    private UserRepository databaseRepository; 

    @Override 
    public UserDTO findOne(String email, QueryParams queryParams) { 
     return null; 
    } 

    @Override 
    public Iterable<UserDTO> findAll(QueryParams queryParams) { 
     return null; 
    } 

    @Override 
    public Iterable<UserDTO> findAll(Iterable<String> iterable, QueryParams queryParams) { 
     return null; 
    } 

    @Override 
    public void delete(String email) { 
    } 

    @Override 
    public UserDTO save(UserDTO s) { 
     return null; 
    } 
} 

我想用類似的方法來測試它,因爲我與正常,春控制器做到這一點,使用到的Mockito嘲笑數據庫存儲庫,並使用MockMvc:

import org.junit.Before; 
import org.junit.Test; 
import org.junit.runner.RunWith; 
import org.mockito.InjectMocks; 
import org.mockito.Mock; 
import org.mockito.runners.MockitoJUnitRunner; 
import org.springframework.test.web.servlet.MockMvc; 
import org.springframework.test.web.servlet.setup.MockMvcBuilders; 

import java.util.Optional; 

import static org.mockito.Mockito.when; 
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; 
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; 

@RunWith(MockitoJUnitRunner.class) 
public class UserJsonApiTest { 

    @InjectMocks 
    private UserResourceRepository resourceRepository; 

    @Mock 
    private UserRepository databaseRepository; 

    private MockMvc mockMvc; 

    @Before 
    public void setup() { 
     mockMvc = MockMvcBuilders.standaloneSetup(resourceRepository).build(); 
    } 

    @Test 
    public void first() throws Exception { 
     Optional<UserEntity> user = Optional.of(new UserEntity(). 
       id(1). 
       email("[email protected]"). 
       firstName("test first name"). 
       lastName("test last name"). 
       pass("test pass")); 

     when(
       databaseRepository. 
         findOneByEmail(user.get().getEmail())). 
       thenReturn(user); 

     mockMvc.perform(
       get("https://stackoverflow.com/users/" + user.get().email())). 
       andExpect(status().isOk()) 
     ; 
    } 

} 

顯然,這個代碼不工作,因爲我的卡塔西斯UserResourceRepository是不是一個真正的控制器。到目前爲止,我已經從日誌中瞭解到它實際上使用了一些名爲io.katharsis.spring的過濾器映射和類。 KatharsisFilterV2

有沒有辦法使用MockMvc進行這樣的測試?如果沒有 - 是否有其他方式可以測試它,而無需啓動整個服務器(嘲笑)?

回答

2

你可以使用嵌入式服務器 - 像UndertowJaxrsServer - 並注入KatharsisFeature:

  1. 創建延伸應用public static class MyApp extends Application {類(MyApp的),並在這個類部署到嵌入式服務器server.deploy(MyApp.class);
  2. ,覆蓋getClasses並添加第二個類(KatharsisFeatureTest),它實現了功能KatharsisFeatureTest implements Feature
  3. 在KatharsisFeatureTest中,然後您可以註冊一個KatharsisFeature,然後您可以覆蓋JsonServiceLocator並注入模擬。

聽起來有點複雜,但作品像魅力:) 看看我的實施。

@RunWith(MockitoJUnitRunner.class) 
public class EndpointResourceTest { 
    @Mock 
    private EndpointService endpointService; 

    @InjectMocks 
    private final static EndpointResourceV1 endpointRessource = new EndpointResourceV1(); 

    private static UndertowJaxrsServer server; 

    @BeforeClass 
    public static void beforeClass() throws Exception { 
     server = new UndertowJaxrsServer(); 
     server.deploy(MyApp.class); 
     server.start(); 
    } 


    @Test 
    public void testGetEndpoint() throws URISyntaxException { 
     Mockito.when(endpointService.getEndpoint("SUBMIT")).thenReturn(new EndpointDTO("SUBMIT", "a", "b")); 

     Client client = ClientBuilder.newClient(); 
     Response response = client.target(TestPortProvider.generateURL("/api/endpoints/SUBMIT")) 
       .request(JsonApiMediaType.APPLICATION_JSON_API) 
       .get(); 

     Assert.assertEquals(200, response.getStatus()); 
     String json = response.readEntity(String.class); 
     Assert.assertTrue(json.contains("SUBMIT")); 
     Assert.assertTrue(json.contains("a")); 
     Assert.assertTrue(json.contains("b")); 
     Mockito.verify(endpointService, Mockito.times(1)).getEndpoint("SUBMIT"); 
    } 

    @AfterClass 
    public static void afterClass() throws Exception { 
     server.stop(); 
    } 

    @ApplicationPath("/api") 
    public static class MyApp extends Application { 
     @Override 
     public Set<Class<?>> getClasses() { 
      HashSet<Class<?>> classes = new HashSet<Class<?>>(); 
      classes.add(KatharsisFeatureTest.class); 
      return classes; 
     } 
    } 

    public static class KatharsisFeatureTest implements Feature { 
     @Override 
     public boolean configure(FeatureContext featureContext) { 
      featureContext 
       .property(KatharsisProperties.RESOURCE_SEARCH_PACKAGE, "...") 
       .register(new io.katharsis.rs.KatharsisFeature(
        new ObjectMapper(), new QueryParamsBuilder(new DefaultQueryParamsParser()), new SampleJsonServiceLocator() { 

         @Override 
         public <T> T getInstance(Class<T> clazz) { 
          try { 
           if (clazz.equals(EndpointResourceV1.class)) { 
            return (T) endpointRessource; 
           } 

           return clazz.newInstance(); 
          } 
          catch (InstantiationException | IllegalAccessException e) { 
           throw new RuntimeException(e); 
          } 
         } 

        })); 

      return true; 
     } 
    } 

}