gpt4 book ai didi

java - 模拟/PowerMock : how to reset a mocked static variable in SUT?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:19:05 28 4
gpt4 key购买 nike

我讨厌将单元测试引入遗留代码库,但我不得不这样做。
到目前为止,我使用 Mockito 和 PowerMock 成功地将单元测试引入了遗留代码库。在我遇到这种情况之前工作得很好:

在 SUT 中,有几个静态变量(我在 PowerMock 的帮助下模拟了它们,模拟静态方法和模拟构造函数)。
现在在第一个测试方法中,一切正常,模拟的静态变量返回了预期的输出值。
但是在随后的测试方法中,模拟的静态对象总是返回在第一次测试中设置的值,尽管我在测试之前确实对其调用了reset()。

// legacy code base:
public class SUT {
private static Collaborator1 c1 = null;
private static Collaborator2 c2 = null;

public SUT(param1) {
if (c1 == null) {
c1 = Collaborator1.instance(param1);
c2 = new Collaborator2(c1);
} else {
}
}
}



// newly introduced unit tests:
@RunWith(PowerMockRunner.class)
@PrepareForTest({
SUT.class, // to mock: new Collaborator2(..), as required by PowerMock when mocking constructors
Collaborator1.class, // to mock: Collaborator1.instance(..), as required by PowerMock in mocking static methods
})
public class SUTTest {

private SUT sut;

private Collaborator1 c1 = mock(Collaborator1.class);
private Collaborator2 c2 = mock(Collaborator2.class);

@Before
public void setup() {
// mock c1:
PowerMockito.mockStatic(Collaborator1.class);
when(Collaborator1.instance(param1)).thenReturn(c1);

// mock c2:
PowerMockito.whenNew(Collaborator2.class).withArguments(c1).thenReturn(c2);

reset(c1);
reset(c2);

sut = new SUT(param1);
}

@Test
public void test1() {
when(c2.foo(input1)).thenReturn(out1);

// do something
}

@Test
public void test2() {
when(c2.foo(input2)).thenReturn(out2); // BANG!!! c2.foo(input2) always return "out1"

// do something
}
}



由于 SUT 的构造函数仅在静态 c1 为 null 时实例化 c1 和 c2,因此它们 (c1, c2) 不会在子序列调用中重新实例化。我不明白的是为什么reset(c1), reset(c2)在test2中没有作用?

有什么想法吗?

最佳答案

终于搞定了。基本上,我无法在两个不同的测试运行中设置 stub (模拟的静态实例变量)。我必须在第一个@Before 中设置预期的行为。
所以不用

  @Before  
public void setup() {
...
}

@Test
public void test1() {
when(c2.foo(input1)).thenReturn(out1);
}

@Test
public void test2() {
when(c2.foo(input2)).thenReturn(out2);
}

我应该使用这个序列:

@Before  
public void setup() {
when(c2.foo(input1)).thenReturn(out1);
when(c2.foo(input2)).thenReturn(out2);
}

@Test
public void test1() {
// do something
}

@Test
public void test2() {
// do something
}

PowerMock/Mockito 中的某些限制(错误?)?

关于java - 模拟/PowerMock : how to reset a mocked static variable in SUT?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5786749/

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