junit3为何只能跑public void testXXX()声明方法

本文解析了JUnit测试套件(TestSuite)的构建过程,详细介绍了构造方法内部如何通过反射获取测试类的方法,并检查这些方法是否符合测试方法的标准。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

junit完整生命周期时序图
[img]/upload/attachment/119288/80f65f16-62bd-32b9-9f43-2ab41ba6655f.bmp[/img]
在图中第2步调用TestSuite构造方法时,代码如下:

public TestSuite(final Class theClass) {
fName= theClass.getName();
try {
getTestConstructor(theClass); // Avoid generating multiple error messages
} catch (NoSuchMethodException e) {
addTest(warning("Class "+theClass.getName()+" has no public constructor TestCase(String name) or TestCase()"));
return;
}

if (!Modifier.isPublic(theClass.getModifiers())) {
addTest(warning("Class "+theClass.getName()+" is not public"));
return;
}

Class superClass= theClass;
Vector names= new Vector();
while (Test.class.isAssignableFrom(superClass)) {
Method[] methods= superClass.getDeclaredMethods();
for (int i= 0; i < methods.length; i++) {
addTestMethod(methods[i], names, theClass);
}
superClass= superClass.getSuperclass();
}
if (fTests.size() == 0)
addTest(warning("No tests found in "+theClass.getName()));
}

addTestMethod()方法代码如下:

private void addTestMethod(Method m, Vector names, Class theClass) {
String name= m.getName();
if (names.contains(name))
return;
if (! isPublicTestMethod(m)) {
if (isTestMethod(m))
addTest(warning("Test method isn't public: "+m.getName()));
return;
}
names.addElement(name);
addTest(createTest(theClass, name));
}

isTestMethod()方法代码如下:

private boolean isTestMethod(Method m) {
String name= m.getName();
Class[] parameters= m.getParameterTypes();
Class returnType= m.getReturnType();
return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
}

最后一行代码给出了对test方法声明所做的限制。
package com.pet.service; import static org.junit.Assert.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.util.Arrays; import java.util.Date; import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import com.pet.dao.PetMapper; import com.pet.entity.Pet; import com.pet.service.impl.PetServiceImpl; @RunWith(MockitoJUnitRunner.class) public class PetServiceTest { @Mock private PetMapper petMapper; @InjectMocks private PetServiceImpl petService; private Pet testPet; @Before public void setUp() { // 创建测试宠物对象 testPet = new Pet(); testPet.setPetId(1); testPet.setName("旺财"); testPet.setType("狗"); testPet.setBreed("金毛"); testPet.setAge(2); testPet.setGender("公"); testPet.setHealthStatus("健康"); testPet.setAdoptionStatus("待领养"); testPet.setCreateTime(new Date()); } @Test public void testAddPetSuccess() { // 准备测试数据 Pet newPet = new Pet(); newPet.setName("新宠物"); // 模拟DAO行为 when(petMapper.insertPet(any(Pet.class))).thenReturn(1); // 执行测试 boolean result = petService.addPet(newPet); // 验证结果 assertTrue(result); verify(petMapper, times(1)).insertPet(newPet); } } // @Test // public void testAddPetWithInvalidData() { // // 测试1:宠物对象为空 // boolean result = petService.addPet(null); // assertFalse(result); // // // 测试2:宠物名称为空 // Pet pet = new Pet(); // pet.setName(""); // result = petService.addPet(pet); // assertFalse(result); // // // 验证没有调用DAO // verify(petMapper, never()).insertPet(any()); // } // // @Test // publ这是我的代码在进行junit测试时没反应,我的另一个测试却package com.pet.service; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.junit.MockitoJUnitRunner; import static org.junit.Assert.*; @RunWith(MockitoJUnitRunner.class) public class test { @Test public void testJUnit4Working() { System.out.println("==== JUnit 4 测试运行正常 ===="); assertTrue(true); } }可以正常运行为什么
最新发布
06-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值