我最近写了很多 JUnit 测试,看到了同样的样板模式。
public class MathOpTest {
private MathOp a;
@Before
public void setUp(){
a = new MathOp();
}
...
}
是否有注释可以为我设置它,因为我总是需要编写一个 setUp
方法,而且它通常只有我正在测试的单个类。
类似于:
public class MathOpTest {
@TestSubject
private MathOp a;
...
}
最佳答案
您可以在声明时分配字段:
public class MathOpTest {
private final MathOp mathOp = new MathOp();
...
}
这简单明了,所以我建议您尽可能在声明时在测试类中分配字段(当然是在您提供的情况下)。
如果您想了解更多,请继续阅读。
- JUnit 将为每个测试方法创建一个唯一的测试类实例,因此即使您的测试修改了
MathOp
的内部状态,只要您的测试不这样做,以这种方式使用字段是安全的修改全局状态。 - 对于 JUnit4 风格的测试(即不扩展
junit.framework.TestCase
的测试),JUnit 将在测试方法运行之前创建测试类,并使其符合垃圾回收条件测试方法完成。
使用@Before
方法进行更复杂的初始化。
通常我在以下情况下使用@Before
:
- 字段的初始化比较复杂
- 字段的初始化需要调用声明为抛出检查异常的代码
- 您需要在应用
@Rule
后进行初始化(例如,将模拟注入(inject)构造函数)
通常,当类需要针对不同的用例以不同的方式构造时,您会在测试方法中创建被测对象。
示例
下面是一个使用@Before
和initMocks()
的例子:
public class MathOpTest {
@Mock private Calculator mockCalculator;
@Mock private Supplier<Double> mockPreviousResultSupplier;
private MathOp mathOp;
@Before
public void createMathOp() {
MockitoAnnotations.initMocks(this);
mathOp = new MathOp(
mockCalculator, mockPreviousResultSupplier);
}
...
}
这是使用 @Rule
结果的 @Before
方法示例:
public class MyWriterTest {
@Rule public final TemporaryFolder folder = new TemporaryFolder();
private File output;
private MyWriter writer;
@Before
public void createMyWriter() {
output = folder.newFile();
writer = new MyWriter(output);
}
...
}
旁白:我个人不建议使用 @InjectMocks
来创建您正在测试的类。这对我来说太神奇了。有一个明确的构造函数更清晰、更简单,我喜欢我的测试清晰和简单:-)
关于java - 在 JUnit 测试中是否有设置测试主题的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30676043/