main
your-name 1 week ago
parent e6944aa80a
commit d0a801228e

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
<data-source source="LOCAL" name="@localhost" uuid="7c6458f4-d235-4e6d-8f32-9196f29eae39">
<driver-ref>mysql_aurora.aws_wrapper</driver-ref>
<synchronize>true</synchronize>
<jdbc-driver>software.amazon.jdbc.Driver</jdbc-driver>
<jdbc-url>jdbc:aws-wrapper:mysql://localhost:3306</jdbc-url>
<working-dir>$ProjectFileDir$</working-dir>
</data-source>
</component>
</project>

@ -4,9 +4,64 @@
<exclude-output />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/test" isTestSource="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="lib" level="project" />
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/junit-4.12.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/mockito-core-2.23.4.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/spring-test-5.1.6.RELEASE.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/hamcrest-core-1.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/byte-buddy-1.9.3.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
<orderEntry type="module-library">
<library>
<CLASSES>
<root url="jar://$MODULE_DIR$/web/WEB-INF/lib/objenesis-2.6.jar!/" />
</CLASSES>
<JAVADOC />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

@ -10,7 +10,6 @@ import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@Controller
@ -42,7 +41,7 @@ public class DemoController {
}
//添加成功
@RequestMapping("addOk")
public String addok(Demo demo, HttpServletRequest request) throws Exception {
public String addok(Demo demo) throws Exception {
System.out.println(demo);
demoService.addDemo(demo);
return "redirect:/demo/findAllByPage.action?page=1";
@ -56,7 +55,7 @@ public class DemoController {
}
//demo更新成功
@RequestMapping("updateOk")
public String updateOk(Demo demo, HttpServletRequest request) throws Exception{
public String updateOk(Demo demo) throws Exception{
System.out.println(demo);
demoService.updateDemo(demo);
return "redirect:/demo/findAllByPage.action?page=1";

@ -0,0 +1,201 @@
package com.ssm.controller;
import com.ssm.entity.Demo;
import com.ssm.service.DemoService;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import java.util.Objects;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.*;
/**
* DemoController
* Demo
*/
@RunWith(SpringJUnit4ClassRunner.class)
public class DemoControllerTest {
private MockMvc mockMvc;
@Mock
private DemoService demoService;
@InjectMocks
private DemoController demoController;
// 测试常量
private static final String UPDATE_OK_URL = "/demo/updateOk";
private static final String REDIRECT_URL = "/demo/findAllByPage.action?page=1";
private static final String DEFAULT_DID = "1";
private static final String DEFAULT_DNAME = "测试";
private static final String DEFAULT_COMMENT = "备注";
/**
* MockMockMvc
*/
@Before
public void setUp() {
// 初始化Mock注解使用旧版API适配mockito 2.23.4
MockitoAnnotations.initMocks(this);
// 构建MockMvc
mockMvc = MockMvcBuilders.standaloneSetup(demoController).build();
}
/**
*
*/
@After
public void tearDown() throws Exception {
// mockito 2.23.4 使用 initMocks无需手动清理
}
/**
* updateOk -
*/
@Test
public void testUpdateOk_Success() throws Exception {
// 准备测试数据
Demo demo = new Demo(1, "测试Demo", "测试备注");
// 执行测试模拟POST请求到/updateOk
mockMvc.perform(post("/demo/updateOk")
.param("did", "1")
.param("dname", "测试Demo")
.param("comment", "测试备注")
.contentType(MediaType.APPLICATION_FORM_URLENCODED))
.andExpect(status().is3xxRedirection())
.andExpect(redirectedUrl("/demo/findAllByPage.action?page=1"));
// 验证demoService.updateDemo方法被调用了一次
verify(demoService, times(1)).updateDemo(any(Demo.class));
}
/**
* updateOk - Demo
*/
@Test
public void testUpdateOk_DemoObjectPassed() throws Exception {
// 准备测试数据
Integer expectedId = 2;
String expectedName = "更新后的名称";
String expectedComment = "更新后的备注";
// 执行测试
mockMvc.perform(post("/demo/updateOk")
.param("did", expectedId.toString())
.param("dname", expectedName)
.param("comment", expectedComment)
.contentType(MediaType.APPLICATION_FORM_URLENCODED));
// 验证updateDemo被调用并且传入的Demo对象属性正确
verify(demoService).updateDemo(argThat(demo ->
demo != null &&
Objects.equals(expectedId, demo.getDid()) &&
Objects.equals(expectedName, demo.getDname()) &&
Objects.equals(expectedComment, demo.getComment())
));
}
/**
* updateOk - URL
*/
@Test
public void testUpdateOk_RedirectUrl() throws Exception {
// 执行测试
mockMvc.perform(post("/demo/updateOk")
.param("did", "1")
.param("dname", "测试")
.param("comment", "备注")
.contentType(MediaType.APPLICATION_FORM_URLENCODED))
.andExpect(status().isFound()) // 302重定向
.andExpect(redirectedUrl("/demo/findAllByPage.action?page=1"));
// 验证服务层方法被调用
verify(demoService, times(1)).updateDemo(any(Demo.class));
}
/**
* updateOk -
*/
@Test
public void testUpdateOk_ServiceCalledOnce() throws Exception {
// 执行测试
mockMvc.perform(post("/demo/updateOk")
.param("did", "1")
.param("dname", "测试")
.param("comment", "备注")
.contentType(MediaType.APPLICATION_FORM_URLENCODED));
// 严格验证updateDemo方法只被调用一次
verify(demoService, times(1)).updateDemo(any(Demo.class));
// 验证没有其他方法被调用
verifyNoMoreInteractions(demoService);
}
/**
* updateOk -
*/
@Test
public void testUpdateOk_EmptyComment() throws Exception {
// 执行测试:备注为空
mockMvc.perform(post("/demo/updateOk")
.param("did", "1")
.param("dname", "测试Demo")
.param("comment", "")
.contentType(MediaType.APPLICATION_FORM_URLENCODED))
.andExpect(status().is3xxRedirection());
// 验证仍然调用了updateDemo
verify(demoService, times(1)).updateDemo(argThat(demo ->
demo != null && Objects.equals("", demo.getComment())
));
}
/**
* updateOk -
*/
@Test
public void testUpdateOk_SpecialCharacters() throws Exception {
// 执行测试:包含特殊字符
String specialName = "测试<Demo>&名称";
String specialComment = "备注'内容\"测试";
mockMvc.perform(post("/demo/updateOk")
.param("did", "1")
.param("dname", specialName)
.param("comment", specialComment)
.contentType(MediaType.APPLICATION_FORM_URLENCODED))
.andExpect(status().is3xxRedirection());
// 验证特殊字符能正确传递
verify(demoService).updateDemo(argThat(demo ->
demo != null &&
Objects.equals(specialName, demo.getDname()) &&
Objects.equals(specialComment, demo.getComment())
));
}
/**
* ControllerDemoService
*/
@Test
public void testControllerInjection() {
// 验证demoController不为null
assertNotNull("DemoController不应为null", demoController);
// 验证demoService已被注入虽然是mock对象
assertNotNull("DemoService应被注入", demoController.demoService);
}
}

@ -0,0 +1,182 @@
package com.ssm.ioc;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import static org.junit.Assert.*;
/**
* IOC
* SpringBean
*/
public class TestIocTest {
private static ConfigurableApplicationContext context;
/**
* SpringIOC
*/
@BeforeClass
public static void setUpClass() {
context = new ClassPathXmlApplicationContext("bean-ioc.xml");
}
/**
* IOC
*/
@AfterClass
public static void tearDownClass() {
if (context != null) {
context.close();
}
}
/**
* Patient Bean
*/
@Test
public void testGetPatientBean() {
// 从容器中获取Patient对象类型安全
Patient patient = context.getBean("patient", Patient.class);
// 验证对象不为null
assertNotNull("Patient对象不应为null", patient);
// 验证各个属性值是否正确注入
assertEquals("患者ID应为1001", Integer.valueOf(1001), patient.getPatientId());
assertEquals("患者姓名应为张三", "张三", patient.getPatientName());
assertEquals("性别应为男", "男", patient.getGender());
assertEquals("年龄应为35", Integer.valueOf(35), patient.getAge());
assertEquals("电话应为13800138000", "13800138000", patient.getPhone());
assertEquals("地址应为北京市朝阳区建国路100号", "北京市朝阳区建国路100号", patient.getAddress());
}
/**
* Doctor Bean
*/
@Test
public void testGetDoctorBean() {
// 从容器中获取Doctor对象类型安全
Doctor doctor = context.getBean("doctor", Doctor.class);
// 验证对象不为null
assertNotNull("Doctor对象不应为null", doctor);
// 验证各个属性值是否正确注入
assertEquals("医生ID应为2001", Integer.valueOf(2001), doctor.getDoctorId());
assertEquals("医生姓名应为李医生", "李医生", doctor.getDoctorName());
assertEquals("科室应为内科", "内科", doctor.getDepartment());
assertEquals("职称应为主任医师", "主任医师", doctor.getTitle());
assertEquals("电话应为13900139000", "13900139000", doctor.getPhone());
assertEquals("邮箱应为li.doctor@hospital.com", "li.doctor@hospital.com", doctor.getEmail());
}
/**
* Department Bean
*/
@Test
public void testGetDepartmentBean() {
// 从容器中获取Department对象类型安全
Department department = context.getBean("department", Department.class);
// 验证对象不为null
assertNotNull("Department对象不应为null", department);
// 验证各个属性值是否正确注入
assertEquals("科室ID应为3001", Integer.valueOf(3001), department.getDeptId());
assertEquals("科室名称应为内科", "内科", department.getDeptName());
assertEquals("位置应为门诊楼3层", "门诊楼3层", department.getLocation());
assertEquals("主任应为王主任", "王主任", department.getDirector());
assertEquals("电话应为010-12345678", "010-12345678", department.getPhone());
assertEquals("描述应正确", "内科是医院的核心科室,负责常见疾病的诊断和治疗", department.getDescription());
}
/**
* Appointment Bean
*/
@Test
public void testGetAppointmentBean() {
// 从容器中获取Appointment对象类型安全
Appointment appointment = context.getBean("appointment", Appointment.class);
// 验证对象不为null
assertNotNull("Appointment对象不应为null", appointment);
// 验证各个属性值是否正确注入
assertEquals("预约ID应为4001", Integer.valueOf(4001), appointment.getAppointmentId());
assertEquals("患者姓名应为张三", "张三", appointment.getPatientName());
assertEquals("医生姓名应为李医生", "李医生", appointment.getDoctorName());
assertEquals("科室应为内科", "内科", appointment.getDepartment());
assertEquals("预约日期应为2026-04-15", "2026-04-15", appointment.getAppointmentDate());
assertEquals("状态应为已预约", "已预约", appointment.getStatus());
}
/**
* Bean
*/
@Test
public void testAllBeansCreation() {
// 验证所有Bean都能成功创建类型安全
Patient patient = context.getBean("patient", Patient.class);
Doctor doctor = context.getBean("doctor", Doctor.class);
Department department = context.getBean("department", Department.class);
Appointment appointment = context.getBean("appointment", Appointment.class);
// 验证所有对象都不为null
assertNotNull("Patient对象应成功创建", patient);
assertNotNull("Doctor对象应成功创建", doctor);
assertNotNull("Department对象应成功创建", department);
assertNotNull("Appointment对象应成功创建", appointment);
// 验证对象的toString方法能正常执行
assertNotNull("Patient.toString()不应为null", patient.toString());
assertNotNull("Doctor.toString()不应为null", doctor.toString());
assertNotNull("Department.toString()不应为null", department.toString());
assertNotNull("Appointment.toString()不应为null", appointment.toString());
// 验证toString输出包含关键信息
assertTrue("Patient.toString()应包含患者姓名", patient.toString().contains("张三"));
assertTrue("Doctor.toString()应包含医生姓名", doctor.toString().contains("李医生"));
assertTrue("Department.toString()应包含科室名称", department.toString().contains("内科"));
assertTrue("Appointment.toString()应包含预约状态", appointment.toString().contains("已预约"));
}
/**
* Bean
*/
@Test
public void testBeanSingleton() {
// 多次获取同一个Bean验证是否为同一实例类型安全
Patient patient1 = context.getBean("patient", Patient.class);
Patient patient2 = context.getBean("patient", Patient.class);
// Spring默认Bean是单例的应该是同一实例
assertSame("两次获取的Patient应为同一实例", patient1, patient2);
Doctor doctor1 = context.getBean("doctor", Doctor.class);
Doctor doctor2 = context.getBean("doctor", Doctor.class);
assertSame("两次获取的Doctor应为同一实例", doctor1, doctor2);
}
/**
* Bean
*/
@Test
public void testBeanTypes() {
// 验证获取的Bean类型是否正确使用类型安全的方式获取后验证
Patient patient = context.getBean("patient", Patient.class);
assertNotNull("patient Bean应能正确获取", patient);
Doctor doctor = context.getBean("doctor", Doctor.class);
assertNotNull("doctor Bean应能正确获取", doctor);
Department department = context.getBean("department", Department.class);
assertNotNull("department Bean应能正确获取", department);
Appointment appointment = context.getBean("appointment", Appointment.class);
assertNotNull("appointment Bean应能正确获取", appointment);
}
}

@ -3,14 +3,14 @@ package com.ssm.service;
import com.ssm.Utils.PageBean;
import com.ssm.entity.Demo;
import com.ssm.mapper.DemoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DemoService {
@Resource
@Autowired
private DemoMapper demoMapper;
public PageBean<Demo> getDemoAll(int page) {

Loading…
Cancel
Save