gpt4 book ai didi

java - EasyMock 与 withConstructor 忽略在构造函数中调用的 addMockedMethod

转载 作者:行者123 更新时间:2023-12-02 05:53:17 25 4
gpt4 key购买 nike

我想测试一个类的方法。为此,我需要模拟该类的另一个方法,该方法是从构造函数中调用的。我还必须将模拟对象传递给构造函数。当我不使用 withConstructor 时,它会正确选择 addMockedMethod 。但是每当我使用 withConstructor 时,它就不再使用 addMockedMethod 中传递的方法。 (获取以下代码的异常)我可以在这里做些什么来解决这个问题吗?下面是代码

主类:

public class A {
B b;
C c;
public A (B _b) {
b = _b;
c = getC();
}
public void run (String _val) {
String val = b.getValue();
//do something
}
public static C getC() {
StaticD.getC();
}
}
public class StaticD {
public static C getC() {
throw new RuntimeException("error");
}
}

测试类:

@Test(testName = "ATest")
public class ATest extends EasyMockSupport {
public void testRun() {
B bMock = createMock(B.class);
expect(bMock.getValue()).andReturn("test");
replayAll();
A obj = createMockBuilder(A.class).
addMockedMethod("getC").
withConstructor(bMock).
createMock();
obj.run();
verifyAll();
resetAll();
}

最佳答案

在实例化期间调用 A 类中的 getC() 方法时,仅使用 EasyMock 永远无法对其进行模拟。您基本上是在创建对象之前尝试调用该对象的方法,因此它无法工作。

话虽如此,PowerMock 是你的 friend 。 PowerMock 能够模拟 EasyMock 所不能的方法。在您的示例中,PowerMocks 模拟静态方法的能力将有很大帮助。

这是我为您的案例整理的示例测试,您可以使用它来创建测试。它还允许您创建一个真正的 A 对象,因为您不再尝试模拟它的任何方法。

@RunWith(PowerMockRunner.class) //Tells the class to use PowerMock
@PrepareForTest(StaticD.class) //Prepares the class you want to use PowerMock on
public class ATest extends EasyMockSupport {

@Test
public void testRun() {
final B bMock = createMock(B.class);
final C cMock = createMock(C.class);

PowerMock.mockStatic(StaticD.class); //Makes all the static methods of this class available for mocking
EasyMock.expect(StaticD.getC()).andReturn(cMock); //Adds the expected behaviour
PowerMock.replay(StaticD.class); //PowerMock to replay the static class

final A aReal = new A(bMock);

EasyMock.expect( bMock.getValue() ).andReturn("test");
replayAll();

aReal.run("test");

verifyAll();
resetAll();
}
}

所需的 PowerMock 版本取决于您使用的 JUnit 版本,但所有这些内容都在 PowerMock Home Page 中涵盖。

关于java - EasyMock 与 withConstructor 忽略在构造函数中调用的 addMockedMethod,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23350167/

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