gpt4 book ai didi

java - Powermock Mockito : the method I'm trying to stubb ends up being called

转载 作者:行者123 更新时间:2023-11-30 11:42:43 25 4
gpt4 key购买 nike

我正在尝试测试一个 class A ,它反过来 Autowiring 一个 class B :

public class A {

@Autowired
private B b;

public int foo(int x, int y) {
int z = b.bar(x, y, false);
//do something with z
return z;
}
}

我将 junit 与 powermockmockito 一起使用来尝试测试 class A 中的方法 foo >.

@RunWith(PowerMockRunner.class)
@PrepareForTest(A.class)
public class TestA {

@Test
private void testFoo() {
B b = PowerMockito.mock(B.class);
when(b.bar(2,3,false)).thenReturn(5);
A a = PowerMockito.spy(new A());
Whitebox.setInternalState(a, "b", b);

int z = a.foo(2,3);
Assert.assertEquals(10,z);
}

}

当我尝试运行测试时,我从 class B 中得到了一个 NullPointerException。使用调试器后,我发现在对 B 类bar 方法进行 stub 之后,bar 方法被调用。这种情况下的空指针异常是正常的,因为B类没有正确初始化。

谁能解释为什么会这样,我能做些什么。

最佳答案

我不是 PowerMockito 用户,但你不需要使用 @PrepareForTest(B.class) 吗?我认为注释是针对您正在模拟的最终类或具有静态的类,而不是针对被测类。

还有,你为什么要在 A 上使用 spy()?也许您的示例代码没有公开它,但我看不到它的用途。此外,对于 A,您真的需要 PowerMockito.spy() 吗,或者仅仅使用 Mockito 的 spy() 就足够了(即 两者 A 和 B 都是最终的和/或者有你需要访问/模拟/验证的静态信息)?

我能问一下您为什么要使用 PowerMockito 而不仅仅是 Mockito 吗?如果只是使用 Whitebox 设置 A 内部的私有(private) B,您可以单独使用 Mockito 来完成。您只需在测试方法之外将 A 和 B 声明为:

@InjectMocks A a = new A();
@Mock B b;

它会将所有@Mock 模拟(即b)注入(inject)A。

PowerMock 主要用于模拟静态方法或最终类/方法的情况。

关于java - Powermock Mockito : the method I'm trying to stubb ends up being called,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11567304/

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