vbe*_*nce 66 junit constructor initialization
我正在使用JUnit 4.我看不出构造函数初始化或使用注释的专用init函数之间的区别@Before
.这是否意味着我不必担心它?
有没有什么@Before
比在构造函数中进行初始化更多的情况?
Pét*_*rök 80
不,使用构造函数初始化JUnit测试夹具在技术上等于使用该@Before
方法(由于JUnit为每个测试类创建了一个新的测试类实例@Test
).唯一(内涵)的区别在于它打破了@Before
和之间的对称性@After
,这可能会让一些人感到困惑.恕我直言,最好遵守惯例(正在使用@Before
).
还要注意,在JUnit 4和注释之前,有专用setUp()
和tearDown()
方法 - @Before
和@After
注释取代了这些,但保留了底层逻辑.因此,使用注释还可以使从JUnit 3或更早版本迁移的人员的生活更轻松.
评论的更多细节:
@Before
允许重写父类行为,构造函数强制您调用父类构造函数@Rule
方法之前@Before
运行,在所有这些之后运行@Before
原因@After
方法期间的异常,构造函数中的异常不会小智 26
@Before在某些情况下使用更有意义,因为它在类的构造函数之后被调用.当您使用像Mockito这样的模拟框架和@Mock注释时,这种差异非常重要,因为在模拟初始化之后将调用@Before方法.然后,您可以使用模拟为被测试的类提供构造函数参数.
在使用协作bean时,我发现这是我单元测试中非常常见的模式.
这是一个(公认的人为)例子:
@RunWith(MockitoJUnitRunner.class)
public class CalculatorTest {
@Mock Adder adder;
@Mock Subtractor subtractor;
@Mock Divider divider;
@Mock Multiplier multiplier;
Calculator calculator;
@Before
public void setUp() {
calculator = new Calculator(adder,subtractor,divider,multiplier);
}
@Test
public void testAdd() {
BigDecimal value = calculator.add(2,2);
verify(adder).add(eq(2),eq(2));
}
}
Run Code Online (Sandbox Code Playgroud)
我更喜欢使用构造函数初始化我的测试对象,因为它允许我创建所有成员,final
以便IDE或编译器告诉我何时构造函数忘记初始化成员并阻止其他方法设置它们.
恕我直言,@Before
违反了最重要的Java约定之一,依赖于构造函数来完全初始化对象!
我更喜欢将我的fixtures声明为final并在内联或构造函数中初始化它们,所以我不会忘记初始化它们!但是,由于@Before中抛出的异常以更加用户友好的方式处理,我通常会在@Before中初始化测试中的对象.
归档时间: |
|
查看次数: |
39144 次 |
最近记录: |