首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用JsonApi和Mockito测试Katharsis JsonApi

用JsonApi和Mockito测试Katharsis JsonApi
EN

Stack Overflow用户
提问于 2016-02-02 16:50:19
回答 1查看 634关注 0票数 2

我想测试我的Katharsis ResourceRepository (katharsis-Spring2.1.7)配置的行为:

代码语言:javascript
复制
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;
    }
}

我想用类似于使用普通Spring控制器进行测试的方式来测试它,使用Mockito模拟数据库存储库和使用MockMvc:

代码语言:javascript
复制
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("test@test").
                firstName("test first name").
                lastName("test last name").
                pass("test pass"));

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

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

}

显然,这段代码不能工作,因为我的Katharsis UserResourceRepository并不是一个真正的控制器。到目前为止,我从日志中了解到,它实际上正在使用一些过滤器、映射和名为io.katharsis.spring.KatharsisFilterV2.的类。

有任何方法可以使用MockMvc进行这样的测试吗?如果没有-还有其他方法可以在不启动整个服务器的情况下测试它(使用模拟)吗?

EN

回答 1

Stack Overflow用户

发布于 2016-02-15 16:11:27

您可以使用类似于嵌入式服务器的UndertowJaxrsServer,并注入KatharsisFeature:

  1. 创建一个类(MyApp)来扩展应用程序public static class MyApp extends Application {并将其部署到嵌入式服务器server.deploy(MyApp.class);
  2. 在这个类中,覆盖getClasses并添加第二个类(KatharsisFeatureTest)来实现KatharsisFeatureTest implements Feature特性
  3. 在KatharsisFeatureTest中,您可以注册一个KatharsisFeature,在那里您可以覆盖JsonServiceLocator并注入模拟。

听起来有点复杂,但很有魅力:)看看我的实现。

代码语言:javascript
复制
@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;
        }
    }

}    
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35159206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档