我想测试我的Katharsis ResourceRepository (katharsis-Spring2.1.7)配置的行为:
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:
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进行这样的测试吗?如果没有-还有其他方法可以在不启动整个服务器的情况下测试它(使用模拟)吗?
发布于 2016-02-15 16:11:27
您可以使用类似于嵌入式服务器的UndertowJaxrsServer,并注入KatharsisFeature:
public static class MyApp extends Application {并将其部署到嵌入式服务器server.deploy(MyApp.class);KatharsisFeatureTest implements Feature特性听起来有点复杂,但很有魅力:)看看我的实现。
。
@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;
}
}
} https://stackoverflow.com/questions/35159206
复制相似问题