Java PowerMock,如何使静态方法多次返回值?

Java PowerMock,如何使静态方法多次返回值?,java,powermock,Java,Powermock,这可能是一个简单的问题,但我无法通过合理的搜索找到答案。 我试图使静态方法在多个测试中多次返回值。我无法使用PowerMock的mock静态方法实现这一点。简单地说,我有一个JUnit测试@BeforeClass,如下所示 @RunWith(PowerMockRunner.class) @PrepareForTest(StaticStuff.class) public class MyTest extends TestCase { @BeforeClass public static v

这可能是一个简单的问题,但我无法通过合理的搜索找到答案。 我试图使静态方法在多个测试中多次返回值。我无法使用PowerMock的mock静态方法实现这一点。简单地说,我有一个JUnit测试@BeforeClass,如下所示

@RunWith(PowerMockRunner.class)
@PrepareForTest(StaticStuff.class)
public class MyTest extends TestCase {
  @BeforeClass
  public static void init() {
    // Mock some stuff
    PowerMockito.mockStatic(StaticStuff.class);
    Mockito.when(StaticStuff.get()).thenReturn("something");
  }
}
现在,这适用于访问静态方法的第一个测试,但其余测试将接收“null”(update:或“real”方法将返回的任何其他值)。我可以简单地将@BeforeClass更改为@Before,从而为每个测试重新创建静态模拟来解决这个问题。但无论如何,这不是正确的方法。对于这种特殊情况,这就可以了,但我相信应该有一种方法可以提供信息,该方法可以在“任何时候”被调用

实际上,我从文档中了解到,相同的值应该“默认情况下无限次”返回(但事实并非如此。从Mockito文档中可以看出:“一旦存根,mocked方法将始终返回存根值,无论调用多少次。”。此外,我希望说明通话量应该是这么简单(但事实并非如此):


也许我遗漏了什么?

测试应该彼此独立。如果使用JUnit,则测试的顺序根本不确定(请参阅)。我认为在
@BeforeClass
中创建模拟实际上是一种不好的做法,因为它可能导致测试相互依赖。因此,我只建议使用@Before方法初始化所有mock,如果您为测试准备了一些非常常见的东西(如连接池或类似的东西),则只使用
@BeforeClass

JUnit/Mockito/PowerMockito版本在使用什么?我认为在4.11/1.9.5/1.5.4中不会发生这种情况。PowerMock版本是1.5.4。最初的问题是一个更大的测试类的一部分(我不能自然地在这里发布)。我稍微简化了测试用例,但本质上就是这样。我将使用给定的代码创建一个实际的测试来进一步测试。JUnit=4.11&Mockito=1.9.5实际测试涉及静态mocked方法返回另一个mocked对象。这将使用Spring替换Wicket中的“某些”行为。这实际上是一个合并问题,我只是重新制作了测试,同时编辑了实际的实现,以包括我现在必须用新测试模拟的行为。请看,我很熟悉测试不是按特定顺序运行的事实。我在BeforeClass中创建mock,因为它在所有情况下都完全相同,因此为所有测试重新创建它将导致不必要的处理。然而,我注意到,无论模拟方法被调用多少次,在单个测试中总是返回相同的值。你是对的,但这不是实际问题的答案。由于您所解释的原因,在BeforeClass中使用mock甚至可能会被阻止,但我找不到任何相关信息。我猜当您使用PowermockRunner时,它可能会在每次测试后重置mock(我至少会这样写)。因此,第一个测试对我来说是正常的,这意味着第一个测试在@BeforeClass中准备了mock,然后在第一个测试之后重置它。这只是猜测,但我想这可能是真的。这听起来可能,而且似乎是真的。
Mockito.when(StaticStuff.get()).thenReturn("something").times(10);