gpt4 book ai didi

java - 休息 Controller 单元测试

转载 作者:行者123 更新时间:2023-12-03 21:21:18 28 4
gpt4 key购买 nike

我正在尝试为 Rest Controller 进行单元测试。我为经理对数据库访问做了一个 stub (~mock),它运行良好。我唯一的问题是,当我开始单元测试时,它不会启动应用程序。

如何从我的单元测试启动应用程序?

我正在使用 spring 4.2.3、spring boot 1.3.7、junit 4.12。

这是我的类(class):

TestRestController

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(locations = "classpath:/META-INF/spring/mvc/mvc-test-context.xml")
public class RestControllerTest extends AbstractTransitionnalTest {

@Autowired
private IManager Manager;

@Test
public void getTestSingleItem(){
Item itm = myTestItemPreInitiallized;
Manager.save(itm);
List<Map> apiResponse = restTemplate.getForObject(networkAddress + "/items", List.class);
// Assertions on apiResponse
}
}

休息 Controller :

@RestController
@RequestMapping("/items")
class RestController {

@Autowired
private IManager Manager;

// Controller content
}

mvc-test-context.xml 中的 Bean

<bean
id="IManager"
class="com.service.ManagerStub">
</bean>
<bean
id="RestController"
class="com.controller.RestController">
</bean>

包含主要内容的应用程序类

@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@ImportResource({ "classpath:/META-INF/spring/context-application.xml" })
public class Application {

如果我现在运行它,应用程序类没有启动,我得到以下错误:I/O error on GET request for address:Connection refused

如果您没有确切的解决方案或想提出另一种方法来执行此操作或解决方法,我希望将 ManagerStub 插入到 @Autowired 管理器,而不是 Manager 类,仅当我启动我的测试时。

最佳答案

我们可以结合使用 MockitoJUnitRunner 和 Spring 的 MockMvcBuilders 类来编写 Spring REST Controller 的单元测试。

我已经更改了您的代码并在下面引用它来为您的 REST Controller 编写 JUnit。

import java.util.ArrayList;
import java.util.List;

import org.junit.Before;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;

import com.fasterxml.jackson.databind.ObjectMapper;

import biz.cogitare.framework.controllers.advices.ExceptionControllerAdvice;

@RunWith(MockitoJUnitRunner.class)
public class RestControllerTest {

private MockMvc mockMvc;

private Item item;

private String itemJSON;

@Mock
private Manager manager;

@InjectMocks
private RestController restController = new RestController();

@Before
public void setUp() throws Exception {
MockitoAnnotations.initMocks(this);

mockMvc = MockMvcBuilders.standaloneSetup(restController)
.setMessageConverters(new MappingJackson2HttpMessageConverter());

Item item = myTestItemPreInitiallized;

itemJSON = new ObjectMapper().writeValueAsString(itm);
}

@Test
public void testQuerySuccess() throws Exception {

List<Item> items = new ArrayList<>();
items.add(item);

Mockito.when(manager.findItems()).thenReturn(items);

mockMvc.perform(get("/items?itemId=1").accept(MediaType.APPLICATION_JSON)).andExpect(status().isOk());
//.andExpect(jsonPath("$[0].id", is(1)))
//.andExpect(jsonPath("$[0].name", is("xyz")));

Mockito.verify(manager).findItems();
}


@Test
public void testInsertSuccess() throws Exception {

Mockito.when(manager.insertOrUpdate(Mockito.any(Item.class))).thenReturn(item);

mockMvc.perform(post("/items").contentType(MediaType.APPLICATION_JSON).content(itemJSON)
.accept(MediaType.APPLICATION_JSON)).andExpect(status().isCreated());

Mockito.verify(manager).save(Mockito.any(Item.class));
}
}

关于java - 休息 Controller 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40289505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com