单元测试,你能测试一种方法吗?

Dav*_*ank 1 java testing unit-testing

我可能会问一些完全明显的事情.我在编写单元测试方面没有太多经验,并且出现了以下问题让我思考.

比如,你有一个类,这个类有你想要测试的方法.但是你能一次测试一种方法吗?我想不是.为了测试该方法,您需要调用一个或多个其他方法.例如:

class MyClass { 
    int x;
    void foo() { x = 4; }
    boolean bar() { x = 3; }
    boolean check() { return x == 4; }
}
Run Code Online (Sandbox Code Playgroud)

为了测试foo和bar,我需要使用check(),另一方面,为了测试检查,我需要使用foo()或bar().

说,我必须遵循测试用例:

class MyClassTest {
    @Test
    void testFoo() {
        MyClass obj = new MyClass();
        obj.foo();
        assert obj.check();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在让我们假设,我的同事更改了check()方法:

boolean check() { return x == 5; }
Run Code Online (Sandbox Code Playgroud)

当然,testFoo()会失败,有人可能会认为foo方法存在问题.

所以这看起来像鸡蛋情况.人们通常如何解决这个问题?

Den*_*aub 5

这里独立测试方法可能没什么意义,因为类的状态可以根据调用的方法顺序而改变.在这种情况下,我会确保行为 - 或状态转换 - 按预期工作.请参考以下三个正确指定类的行为的测试:

class WhenFooWasCalled {
    @Test
    public void ThenCheckShouldReturnTrue {
        MyClass sut = new MyClass();
        sut.foo();
        assertTrue(sut.check());
    }
}

class WhenBarWasCalled {
    @Test
    public void ThenCheckShouldReturnFalse {
        MyClass sut = new MyClass();
        sut.bar();
        assertFalse(sut.check());
    }
}

class WhenNothingWasCalled {
    @Test
    public void ThenCheckShouldReturnFalse {
        MyClass sut = new MyClass();
        assertFalse(sut.check());
    }
}
Run Code Online (Sandbox Code Playgroud)

更新:我添加了第三个测试用例:如果没有调用foo()和bar(),check()的行为如何.