【发布时间】:2015-06-01 23:30:37
【问题描述】:
修改单元测试常量的推荐模式是什么?这是我目前使用的一段时间,今天我意识到它有缺陷。
假设我的班级看起来像这样
class Foo {
private static final int MAX_TIME = Integer.getInteger("myProp", 1000);
...
}
我使用 VM 属性的事实不仅仅是在单元测试中修改它。这是因为我希望它在实际代码中是不可变的,并且我不想用它污染构造函数,因为它是一个实现细节。
所以,在生产中我想要 1 秒的超时时间;但是这对于单元测试来说太长了,所以我这样做了
class FooTest {
@Before
public void setUp() {
System.setProperty("myProp", "50");
}
@Test
public void testThatAssumesTimeoutOf50() { ... }
}
这工作了很长时间,直到今天我终于像这样添加了BarTest
class BarTest {
Foo mockFoo = mock(Foo.class); //actually done in a @Before method in the real code
}
现在,这会导致我的测试失败或通过,具体取决于执行顺序。如果首先测试Foo,则假设测试超时为 50 毫秒的测试通过。但是如果首先测试Bar,那么这会使Foo由于模拟而被加载,所以MAX_TIME采用默认值1000,然后当BarTest结束并且FooTest开始时,假设测试的测试50 毫秒的超时现在失败。
【问题讨论】:
-
每个类的测试应该是独立的。有一些方法可以在类中强制执行顺序。
标签: java unit-testing junit testng