1

我尝试通过执行以下操作来创建一个 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")));
}
}
  • 鉴于控制器不可能用这些参数调用构造函数,我不知道发生了什么以及这个单元测试在做什么

回顾:

  1. 这些原型是从哪里来的,任何人都可以发布这些东西吗?
  2. 为什么响应没有被编组到 JSON 中
  3. 这个单元测试甚至在做什么,因为它没有调用 calc url 调用的方法
4

0 回答 0