gpt4 book ai didi

java - 在 JUnit 测试中是否有设置测试主题的规则

转载 作者:行者123 更新时间:2023-11-30 08:51:09 24 4
gpt4 key购买 nike

我最近写了很多 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)构造函数)

通常,当类需要针对不同的用例以不同的方式构造时,您会在测试方法中创建被测对象。

示例

下面是一个使用@BeforeinitMocks() 的例子:

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com