java - 实例变量的 setter 和 getter 的 Junit 测试

标签 java unit-testing junit

为对象内的实例变量的 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/

相关文章:

java - 加载大量文本时在 JavaFX 2 中加速 TextArea 的方法?

qt - QSignalSpy 捕获引用参数

ios - 什么时候使用 specta 的 'sharedExamplesFor' ?

java - 然而,当其他实例也使用时,JUnit/Mockito 验证 `any(HttpPut.class)` 会通过

java - 使用mockito调用方法时如何检查方法参数?

regex - 迁移: JUnit 3 to JUnit 4: TestSuite

java - 处理 Java Web 应用程序启动错误的正确方法

java - 正则表达式查找 "lastname, firstname middlename"格式

java - 尝试资源

unit-testing - 测试自耕农的 composeWith