2024-08-06
One-liner
雁子南飞时,故人忆往事。 --- 《醉柳引·故人安在兮》 · 月雩
Springboot mock database
@SpringBootTest
@AutoConfigureTestDatabase(connection = EmbeddedDatabaseConnection.NONE)
@AutoConfigureMockMvc
public class ReaderControllerTest {
@MockBean
private ReaderRepository readerRepository;
@Autowired
private MockMvc mockMvc;
@Test
void createReaderTest() throws Exception {
var reader = ReaderData.getReader();
when(readerRepository.findByEmail(anyString())).thenReturn(Optional.empty());
when(readerRepository.save(null)).thenReturn(reader);
var json = """
{ "name": "%s", "email": "%s" }
""".formatted(reader.getName(), reader.getEmail());
mockMvc
.perform(
post("/user").contentType("application/json").content(json))
.andExpect(status().isOk());
}
}
Spock vs JUnit
Spock 和 JUnit 都是 Java 测试框架,但它们在设计理念、特性和使用方式上有一些显著的区别。
共同点
- 测试框架:两者都是用于编写和运行自动化测试的框架。
- 集成工具:都可以与常见的构建工具(如 Maven 和 Gradle)集成。
- 单元测试支持:两者都支持编写单元测试。
不同点
1. 语法与语言特性
- Spock:使用 Groovy 语言编写测试,这使得测试代码更简洁和更具可读性。Spock 测试规范 (
Specification
) 是基于 Groovy DSL 的。class MySpec extends Specification {
def "feature method"() {
expect:
1 + 1 == 2
}
} - JUnit:使用 Java 语言编写测试。JUnit 的测试类和方法通过注解来标识。
public class MyTest {
@Test
public void testAddition() {
assertEquals(2, 1 + 1);
}
}
2. 测试生命周期
- Spock:使用
setup
,setupSpec
,cleanup
,cleanupSpec
方法来定义测试的生命周期方法。class MySpec extends Specification {
def setup() { /* 每个测试方法前执行 */ }
def cleanup() { /* 每个测试方法后执行 */ }
def setupSpec() { /* 类加载后执行一次 */ }
def cleanupSpec() { /* 类卸载前执行一次 */ }
} - JUnit:使用
@Before
,@After
,@BeforeClass
,@AfterClass
注解来定义生命周期方法。public class MyTest {
@Before
public void setUp() { /* 每个测试方法前执行 */ }
@After
public void tearDown() { /* 每个测试方法后执行 */ }
@BeforeClass
public static void beforeAll() { /* 类加载后执行一次 */ }
@AfterClass
public static void afterAll() { /* 类卸载前执行一次 */ }
}