为对象内的实例变量的 setter 和 getter 创建测试用例时。什么是最好的方法?在这里,我在测试中使用了 get 和 set 方法。这会是糟糕的测试策略吗?
/**
* Test of setFlightNumber method, of class Flight.
*/
@Test
public void testSetFlightNumber() {
System.out.println("setFlightNumber");
int flightNumber = 1000;
Flight instance = new Flight();
instance.setFlightNumber(flightNumber);
// TODO review the generated test code and remove the default call to fail.
assertEquals(instance.getFlightNumber(), flightNumber);
}
/**
* Test of getFlightNumber method, of class Flight.
*/
@Test
public void testGetFlightNumber() {
System.out.println("getFlightNumber");
Flight instance = new Flight();
int expResult = 1000;
instance.setFlightNumber(1000);
int result = instance.getFlightNumber();
assertEquals(expResult, result);
}
最佳答案
单元测试的主要原则是测试一个简单的单元代码;也就是说,每种方法都应该根据自己的优点进行测试。
这意味着我们不能在我们的 set
测试中使用 get
方法,反之亦然 - 您不是在测试单个代码单元方法。
鉴于...
假设我们有一个 PlainOldJavaObject
,它有一个字段 value
,我们希望(出于某种原因)测试 setter 和 getter 的有效性。唯一合适的方法是通过 use of reflection .
这是我的类声明,它非常简洁:
public class PlainOldJavaObject {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
我现在设置我的测试类以利用反射;具体使用 Field
类:
public class PlainOldJavaObjectTest {
@Test
public void testSetter_setsProperly() throws NoSuchFieldException, IllegalAccessException {
//given
final PlainOldJavaObject pojo = new PlainOldJavaObject();
//when
pojo.setValue("foo");
//then
final Field field = pojo.getClass().getDeclaredField("value");
field.setAccessible(true);
assertEquals("Fields didn't match", field.get(pojo), "foo");
}
@Test
public void testGetter_getsValue() throws NoSuchFieldException, IllegalAccessException {
//given
final PlainOldJavaObject pojo = new PlainOldJavaObject();
final Field field = pojo.getClass().getDeclaredField("value");
field.setAccessible(true);
field.set(pojo, "magic_values");
//when
final String result = pojo.getValue();
//then
assertEquals("field wasn't retrieved properly", result, "magic_values");
}
}
在第一个测试中,我通过反射访问 PlainOldJavaObject
实例的字段中包含的值来确保读取该字段。在不违反声明类*的完整性的情况下,我相信该字段的设置是正确的。
在第二个测试中,我假设该值已经设置为之前的某个值,因此设置涉及使用已知的默认值填充该字段。当我读回值时,我断言读回的值是我们知道它最初设置的值。
最终,如果你有很多 setter 和 getter,你将不得不像这样编写代码(因为,如果你依赖于你的 setter 和 getter“正常工作”的假设,就像你在上面的测试中一样,您的测试用例可能无效)。
*:请注意,反射是一种快速且快速的方法,它会因未定义的行为而陷入极端麻烦,而且您几乎无法保证对象不变性。你正在撕掉语言的 wrapper ,做一些奇怪和不寻常的事情。自行承担风险。
关于java - 实例变量的 setter 和 getter 的 Junit 测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21354311/