我尝试通过执行以下操作来创建一个 Spring 项目
在日食中
文件 > 新建 > 项目 > maven 项目(模板) >
<groupId>am.ik.archetype</groupId>
<artificact>spring-boot-blank-archetype<artifact>
<version>1.0.6</version>
令我惊讶的是,不仅仅是 pom.xml,还有 java 代码。在这一点上,我已经将这个项目提交给了几个问题。
- 不会编译,因为它调用了一个不存在的构造函数,所以我编写了构造函数并让它编译并修复它。
- 然后程序出现运行时错误
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.ValidationException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:583)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:178)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
... 33 more
在阅读了 Stack Overflow 上的这篇文章后,我修改了 pom.xml 以引入 Java 9 中不再包含的缺失依赖项,并重新构建了我的程序。
运行 http://localhost:8080/calc?left=100&right=200 导致出现意外错误(type=Not Acceptable, status=406)
根据这篇文章,我预计 Result 已被编组为 JSON,并且浏览器收到 JSON 响应
考试:
package com.bluehippo.springy;
import com.jayway.restassured.RestAssured;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.IntegrationTest;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import static com.jayway.restassured.RestAssured.given;
import static com.jayway.restassured.RestAssured.when;
import static org.hamcrest.CoreMatchers.is;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = App.class)
@WebAppConfiguration
@IntegrationTest({"server.port:0",
"spring.datasource.url:jdbc:h2:mem:springy;DB_CLOSE_ON_EXIT=FALSE"})
public class HelloControllerTest {
@Value("${local.server.port}")
int port;
@Before
public void setUp() throws Exception {
RestAssured.port = port;
}
@Test
public void testHello() throws Exception {
when().get("/").then()
.body(is("Hello World!"));
}
@Test
public void testCalc() throws Exception {
given().param("left", 100)
.param("right", 200)
.get("/calc")
.then()
.body("left", is(100))
.body("right", is(200))
.body("answer", is(300));
}
}
- Given that the HelloController:
package com.bluehippo.springy;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
NamedParameterJdbcTemplate jdbcTemplate;
@RequestMapping("/")
String hello() {
return "Hello World!";
}
@Data
static class Result {
private final int left;
private final int right;
private final long answer;
public Result (int left, int right, long answer) {
this.left=left;
this.right=right;
this.answer=answer;
if (left+right >500) {
throw new IllegalArgumentException("left+right must be less than 500");
}
}
}
// SQL sample
@RequestMapping("calc")
Result calc(@RequestParam int left, @RequestParam int right) {
MapSqlParameterSource source = new MapSqlParameterSource()
.addValue("left", left)
.addValue("right", right);
return jdbcTemplate.queryForObject("SELECT :left + :right AS answer", source,
(rs, rowNum) -> new Result(left, right, rs.getLong("answer")));
}
}
- 鉴于控制器不可能用这些参数调用构造函数,我不知道发生了什么以及这个单元测试在做什么?
回顾:
- 这些原型是从哪里来的,任何人都可以发布这些东西吗?
- 为什么响应没有被编组到 JSON 中
- 这个单元测试甚至在做什么,因为它没有调用 calc url 调用的方法