Java @RunWith(PowerMockRunner.class)是否在每次测试之前为带有@Mock注释的成员注入新的Mock?

Java @RunWith(PowerMockRunner.class)是否在每次测试之前为带有@Mock注释的成员注入新的Mock?,java,mockito,powermock,Java,Mockito,Powermock,…还是在运行任何测试之前只执行一次 @RunWith(PowerMockRunner.class) public class Tests { @Mock private ISomething mockedSomething; @Test public void test1() { // Is the value of mockedSomething here } @Test public void test2() { // ... guarante

…还是在运行任何测试之前只执行一次

@RunWith(PowerMockRunner.class)
public class Tests {
  @Mock
  private ISomething mockedSomething;

  @Test
  public void test1() {
    // Is the value of mockedSomething here
  }

  @Test
  public void test2() {
    // ... guaranteed to be either the same or a different instance here?  Or is it indeterminate?
  }
}

PowerMockRunner
,与大多数JUnit运行程序一样,创建。这有助于确保测试不会相互干扰

PowerMock源代码有点难以理解,每个JUnit版本的委托和类加载器保存“块”,但您可以看到每次调用
invokeTestMethod
时,它都从
createTest
获取一个新实例,该实例从
createTestInstance
获取

PowerMock然后用新的mock填充新实例。
@Mock
注入的文档很难找到,但我在网上找到了一些。事实证明,
AnnotationEnabler
类因支持库的不同而有所不同,但两者都在
beforeTestMethod
上重新注入新的模拟


请注意,静态字段可能在测试之间保持不变,因此尽管每个测试方法都会新填充实例字段,但静态字段不会。无论您是否使用PowerMock,都要避免在测试中使用可变静态字段。

感谢您的澄清,我知道runner会为每次运行创建新类。但我想知道的是:“尽管每个测试方法都会新填充实例字段”,JUnit runner的契约是否保证了这一点?或者只是一些/大多数/这类跑步者的情况恰好如此?@Mock注入是否也会重做,因为这不是一个“正常”字段?我想如果它不是空的,它将是空的,或者实例与另一个相同,我可以在另一个类的静态中保留它并检查。。。我将不得不尝试编写更多的测试代码。@Tom我已经更新了答案。您可以想象一个JUnit运行程序违反了约定并保存了实例,但它将打破约定。我最初用“应该”来对冲赌注,因为缺乏主要的源代码支持,但后来我找到了它,并且可以确定在每个测试方法之前在哪里以及如何注入模拟。太棒了,谢谢!这类文档正是我希望找到的。我还修改了我的测试以跟踪@Mock实例,并确认它按照承诺工作。