以下是常用的JUnit测试示例,涵盖基础到进阶场景,适合学习和日常使用。示例基于JUnit 5(Jupiter),部分兼容JUnit 4。
@Test
void basicAssertions() {
assertEquals(4, 2 + 2);
assertTrue(5 > 3);
assertNull(null);
assertNotSame(new Object(), new Object());
}
@Test
void expectException() {
assertThrows(ArithmeticException.class, () -> {
int result = 1 / 0;
});
}
@Test
void timeoutTest() {
assertTimeout(Duration.ofSeconds(2), () -> {
Thread.sleep(1000);
});
}
@ParameterizedTest
@ValueSource(ints = {1, 3, 5})
void isOdd(int number) {
assertTrue(number % 2 != 0);
}
@TestFactory
Stream dynamicTests() {
return Stream.of("A", "B", "C")
.map(text -> DynamicTest.dynamicTest("Test " + text, () -> {
assertNotNull(text);
}));
}
@BeforeEach
void setup() {
System.out.println("Before each test");
}
@AfterEach
void cleanup() {
System.out.println("After each test");
}
@Test
@EnabledOnOs(OS.MAC)
void onlyOnMac() {
assertTrue(System.getProperty("os.name").contains("Mac"));
}
@Nested
class NestedTests {
@Test
void innerTest() {
assertEquals(3, 1 + 2);
}
}
@RepeatedTest(3)
void repeatTest() {
assertNotEquals(0, Math.random());
}
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
class OrderedTests {
@Test @Order(1)
void firstTest() { /* ... */ }
@Test @Order(2)
void secondTest() { /* ... */ }
}
@Test
void mockTest() {
List mockList = Mockito.mock(List.class);
when(mockList.size()).thenReturn(10);
assertEquals(10, mockList.size());
}
@Test
void assumeTest() {
Assumptions.assumeTrue("DEV".equals(System.getenv("ENV")));
// 仅在DEV环境下执行
assertTrue(true);
}
interface Testable {
default boolean isValid() { return true; }
}
@Test
void testInterfaceDefault() {
Testable obj = new Testable() {};
assertTrue(obj.isValid());
}
@Test
void tempDirTest(@TempDir Path tempDir) throws IOException {
Path file = tempDir.resolve("test.txt");
Files.write(file, "Hello".getBytes());
assertTrue(Files.exists(file));
}
@Test
void testPrivateMethod() throws Exception {
Method method = MyClass.class.getDeclaredMethod("privateMethod");
method.setAccessible(true);
assertEquals(42, method.invoke(new MyClass()));
}
@Test
void groupedAssertions() {
assertAll("person",
() -> assertEquals("John", person.getFirstName()),
() -> assertEquals("Doe", person.getLastName())
);
}
@Test
void streamTest() {
List numbers = Arrays.asList(1, 2, 3);
assertTrue(numbers.stream().anyMatch(n -> n % 2 == 0));
}
@Test
void customMessage() {
assertEquals(5, 2 + 2, "Math seems broken");
}
@Test
void collectionTest() {
List list = Arrays.asList("a", "b", "c");
assertIterableEquals(List.of("a", "b", "c"), list);
}
@Test
void lambdaTest() {
assertTrue(() -> {
// 复杂逻辑
return true;
});
}
class Parent {
protected String getName() { return "Parent"; }
}
@Test
void testParentMethod() {
Parent obj = new Parent();
assertEquals("Parent", obj.getName());
}
@Test
void fileTest() throws IOException {
Path path = Paths.get("test.txt");
Files.write(path, "content".getBytes());
assertLinesMatch(List.of("content"), Files.readAllLines(path));
Files.delete(path);
}
@Test
void randomTest() {
Random random = new Random(42); // 固定种子
assertEquals(7, random.nextInt(10));
}
@Test
void systemPropertyTest() {
System.setProperty("test.key", "value");
assertEquals("value", System.getProperty("test.key"));
}
@Test
void threadTest() throws InterruptedException {
AtomicInteger counter = new AtomicInteger();
Thread thread = new Thread(() -> counter.incrementAndGet());
thread.start();
thread.join();
assertEquals(1, counter.get());
}
以上示例覆盖了单元测试的常见场景,可根据实际需求调整参数和断言逻辑。JUnit 5的完整文档可通过官网进一步查阅。
以下是基于Spring Boot和JUnit的自动化测试实例,涵盖单元测试、集成测试、Mock测试等常见场景,以代码片段和说明方式呈现。每个例子均遵循Spring Boot测试最佳实践。
@SpringBootTest
public class UserServiceTest {
@Autowired
private UserService userService;
@Test
public void testCreateUser() {
User user = new User("test", "[email protected]");
User savedUser = userService.createUser(user);
assertNotNull(savedUser.getId());
assertEquals("test", savedUser.getUsername());
}
}
@SpringBootTest
public class OrderServiceTest {
@MockBean
private OrderRepository orderRepository;
@Autowired
private OrderService orderService;
@Test
public void testFindOrderById() {
Order mockOrder = new Order(1L, "PENDING");
when(orderRepository.findById(1L)).thenReturn(Optional.of(mockOrder));
Order result = orderService.getOrderById(1L);
assertEquals("PENDING", result.getStatus());
}
}
@WebMvcTest(UserController.class)
public class UserControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private UserService userService;
@Test
public void testGetUser() throws Exception {
when(userService.getUser(1L)).thenReturn(new User(1L, "admin"));
mockMvc.perform(get("/users/1"))
.andExpect(status().isOk())
.andExpect(jsonPath("$.username").value("admin"));
}
}
@Test
public void testInvalidUserRegistration() {
User invalidUser = new User("", "invalid-email");
assertThrows(ValidationException.class,
() -> userService.createUser(invalidUser));
}
@DataJpaTest
public class ProductRepositoryTest {
@Autowired
private TestEntityManager entityManager;
@Autowired
private ProductRepository productRepository;
@Test
public void testFindByCategory() {
entityManager.persist(new Product("Laptop", "Electronics"));
List products = productRepository.findByCategory("Electronics");
assertEquals(1, products.size());
}
}
@SpringBootTest
@TestPropertySource(locations = "classpath:test.properties")
public class ConfigTest {
@Value("${app.test.value}")
private String testValue;
@Test
public void testConfigLoad() {
assertEquals("test123", testValue);
}
}
@Test
public void testAsyncOperation() throws Exception {
CompletableFuture future = asyncService.asyncTask();
String result = future.get(2, TimeUnit.SECONDS);
assertEquals("Done", result);
}
@RunWith(PowerMockRunner.class)
@PrepareForTest(UtilityClass.class)
public class UtilityTest {
@Test
public void testStaticMethod() {
mockStatic(UtilityClass.class);
when(UtilityClass.generateId()).thenReturn("mock-id");
assertEquals("mock-id", UtilityClass.generateId());
}
}
@WithMockUser(username = "admin", roles = "ADMIN")
@Test
public void testAdminEndpoint() throws Exception {
mockMvc.perform(get("/admin"))
.andExpect(status().isOk());
}
@RestClientTest(ApiClient.class)
public class ApiClientTest {
@Autowired
private MockRestServiceServer server;
@Autowired
private ApiClient apiClient;
@Test
public void testGetData() {
server.expect(requestTo("/api/data"))
.andRespond(withSuccess("{\"id\":1}", MediaType.APPLICATION_JSON));
ApiResponse response = apiClient.fetchData();
assertEquals(1, response.getId());
}
}
@ParameterizedTest
@ValueSource(strings = {"cat", "dog", "fish"})
public void testStringLength(String input) {
assertTrue(input.length() > 2);
}
@SpringBootTest
@Transactional
public class TransactionTest {
@Test
public void testRollback() {
// 测试方法执行后事务会自动回滚
userRepository.save(new User("temp", "[email protected]"));
assertEquals(1, userRepository.count());
}
}
@Test
public void testCustomAnnotation() {
Method method = MyService.class.getMethod("annotatedMethod");
assertNotNull(method.getAnnotation(MyAnnotation.class));
}
@Test
public void testLogOutput() {
Logger logger = (Logger) LoggerFactory.getLogger(MyService.class);
MemoryAppender appender = new MemoryAppender();
appender.start();
logger.addAppender(appender);
service.performAction();
assertTrue(appender.contains("Action performed", Level.INFO));
}
@Test
public void testCacheEvict() {
service.getData(1L); // 存入缓存
service.getData(1L); // 应从缓存读取
verify(repository, times(1)).findById(1L);
service.clearCache();
service.getD