gpt4 book ai didi

java - jUnit @beforeAll 不工作

转载 作者:行者123 更新时间:2023-12-02 11:06:41 32 4
gpt4 key购买 nike

我正在为rest api spring boot编写单元测试。

@RunWith(SpringRunner.class)
@SpringBootTest(classes = WorkflowEngineApiApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class ActionControllerTest {
@LocalServerPort
public int port;

private final TestRestTemplate testRestTemplate = new TestRestTemplate();

private final HttpHeaders headers = new HttpHeaders();

private long actionId;

@BeforeClass
public static void init() throws Exception{
String url="/api/v1/actions";
JSONObject action = new JSONObject();
action.put("name", "Name Test");
action.put("actionTypeId", 4L);
action.put("description", null);
action.put("createdBy", 2L);
action.put("processId", 2L);
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
ResponseEntity<ApiResponse> response = getResponse(url, HttpMethod.POST, action.toString());
}

private static ResponseEntity<ApiResponse> getResponse(String url, HttpMethod method, Object action){
HttpEntity<Object> entity = new HttpEntity<>(action, headers);
return testRestTemplate.exchange(createURL(url), method, entity, ApiResponse.class);
}

/**
* create url http://localhost:...
* @param uri String
* @return String
*/
public static String createURL(String uri) {
return "http://localhost:" + port + uri;
}
}

我想在测试运行之前向 Db 添加 1 行。但是当我将 @BeforeClass 与静态方法一起使用时,端口变量必须是静态的,但它不生成值。依然是0。错误显示:

org.springframework.web.client.ResourceAccessException: I/O error on POST request for "http://localhost:0/api/v1/actions"

我的问题:有没有办法将@BeforeClasswebEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT一起使用,这意味着@LocalServerPort生成值与静态?

最佳答案

I want to add 1 row to Db before test run. But when I use @BeforeClass with static method, port variable must be static, but it not generate value. It's still 0. Error show:

所以,我的理解是,您想要写下从 Controller 流向数据库的集成测试。这是我的建议。

@RunWith(SpringRunner.class)
@SpringBootTest
@WebAppConfiguration
@Transactional
public class MyIntTest {

private MockMvc mockMvc;

@Autowired
private WebApplicationContext ctx;

@Before
public void setUp() {
this.mockMvc = MockMvcBuilders.webAppContextSetup(ctx).build();

MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.post(**Your URL").accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON);

builder.setContent("Your JSON request data");

// This will invoke POST request to "URL"
this.mockMvc.perform(builder);

// If you want to verify your result
MvcResult result = this.mockMvc.perform(builder).andReturn();

// Read response. If its custom class then just change return type.
List responses = getPojoFromMvcResult(result, List.class);
}

public static <T> T getPojoFromMvcResult(MvcResult result, Class<T> valueType) throws IOException {
try {
MockHttpServletResponse response = result.getResponse();
String responseJson = response.getContentAsString();
return convertJsonToObject(responseJson, valueType);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}

public static <T> T convertJsonToObject(String content, Class<T> valueType) throws IOException {
return new ObjectMapper().readValue(content, valueType);
}
}

关于java - jUnit @beforeAll 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50907132/

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