我正在尝试为名为Student的类编写一些junit测试。基本上,每个学生都有一个studentNum,它被设置为一个私有静态int的迭代器。每次创建新学生时,studentNum都会递增。
我对一个函数进行了多次测试,该函数从学生的arraylist中获得StudentNum为1的Student。但是,每当我在新测试中创建一个新的学生arraylist时,studentNum就会从之前测试的studentNum中断。所以第一次测试将使学生的学生从0到5,第二次测试将使学生的学生从6到11。
我想知道是否有办法从我的测试类中重置私有静态studentNum整数,这样我可以让每个测试从0开始?任何帮助都会有很大的帮助。
答案 0 :(得分:3)
您发现这很难测试的事实是一个警告信号,您可能需要重新考虑您的设计。问问自己:为什么Student
类负责生成唯一ID?
如果你将id生成逻辑(即使它只是递增单个计数器这么简单)分离到一个单独的类中,突然你可以在测试Student
并且拥有它时模拟该类在测试中返回您想要的任何ID。
答案 1 :(得分:2)
每个学生都有一个studentNum,这是一个私人静态 int
这句话毫无意义。如果您的Student对象的每个实例都有自己的id,那么id
字段 not 根据定义不应该是静态的。
答案 2 :(得分:0)
查看@Before/@After
注释。在每个测试用例运行之前/之后调用这样注释的方法。您可以在那里重置数据。
@Before
public void setup(){
}
答案 3 :(得分:-1)
想想静态decalration意味着什么...... 出于实际目的,如果studentNum拥有学生特色号,则不得为静态。使用static,所有Student对象都将拥有最新的studentNum。
但是如果它是一个要求(无法想象什么......),那么对于具有多个@Test方法的junit(并且只有)是正确的。这样做:
@Before
public void setUp() throws Exception {
Student.studentNum =0;
}
它将在执行每个@Test方法调用之前重置静态studentNum。
答案 4 :(得分:-2)
使用Java的Reflection API,您可以使用@Before
或@After
(或两者)将私有静态字段重置为您希望的任何值(例如0)。
这样做的方法是:
@Before
public void setup() throws Exception {
Field studentNum = Student.class.getDeclaredField("studentNum");
studentNum.setAccessible(true); //to overcome the visibility issue
studentNum.setInt(null, 0); //null since it's static
}