我最近一直在编写很多JUnit测试并看到相同的样板模式。
public class MathOpTest {
private MathOp a;
@Before
public void setUp(){
a = new MathOp();
}
...
}
是否有注释可以为我设置,因为我总是需要编写setUp
方法,而且通常只有我正在测试的单个类。
类似的东西:
public class MathOpTest {
@TestSubject
private MathOp a;
...
}
答案 0 :(得分:1)
在我的回忆中,香草JUnit中没有这样的东西直接存在。大多数人选择在@Before
语句中或在测试内部初始化他们的测试主题。在它的辩护中,它清楚地表明在测试运行之前建立的是什么,并且它总是重置测试对象的状态。
如果您正在使用Mockito,实际上您确实可以使用@InjectMocks
声明一个类并使用http://1drv.ms/1KfCiHK进行注释来实例化该类并注入之前的任何@Mock
类。
答案 1 :(得分:1)
您可以在声明字段时指定字段:
public class MathOpTest {
private final MathOp mathOp = new MathOp();
...
}
这很简单直接,所以我建议您尽可能在申报时分配测试类中的字段(当然是在您提供的情况下)。
如果您想了解更多信息,请继续阅读。
MathOp
的内部状态,只要您的测试不修改全局状态,使用这种方式的字段是安全的junit.framework.TestCase
的测试),JUnit将在测试方法运行之前创建测试类,并在测试方法完成后使其符合垃圾回收的条件。 使用@Before
方法进行更复杂的初始化。
通常在以下情况下使用@Before
:
@Rule
后进行初始化(例如,将模拟注入构造函数)通常,当需要为不同的用例构造类的不同方法时,您将在测试方法中创建测试对象。</ p>
<强>实施例强>
以下是使用@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);
}
...
}
以下是使用@Before
结果的@Rule
方法示例:
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
来创建您正在测试的课程。这对我来说太神奇了。拥有一个明确的构造函数更简洁,我喜欢我的测试清晰简单: - )