gpt4 book ai didi

java - 有什么办法可以代替动态方法吗?

转载 作者:行者123 更新时间:2023-11-29 03:57:31 25 4
gpt4 key购买 nike

假设我们有一个接口(interface),它有两个方法:

public interface MyInterface {
public SomeType first();
public SomeType second();
}

此接口(interface)由MyInterfaceImpl 实现。在实现内部,first() 调用 second() 来检索一些结果。

我想构建一个单元测试,根据 second() 的结果断言 first() 的结果,类似于:

1  public class MyInterfaceTest {
2 private MyInterface impl = new MyInterfaceImpl();

4 @Test
5 public void testFirst() {
6 // modify behaviour of .second()
7 impl.first();
8 assertSomething(...);

10 // modify behaviour of .second()
11 impl.first();
12 assertSomethingElse(...);
13 }
14 }

是否有一种简单的方法可以在 2 行上创建模拟,以便直接调用对选定方法(例如 first())的所有调用(委托(delegate)给MyInterfaceImpl) 而其他一些方法(例如 second())被模拟对应物替换了吗?

对于静态方法,使用 PowerMock 实际上很容易做到这一点,但对于动态方法,我需要类似的东西。

解决方案基于

MyInterface mock = EasyMock.createMock(MyInterface.class);
MyInterface real = new MyInterfaceImpl();
EasyMock.expect(mock.first()).andReturn(real.first()).anyTimes();
EasyMock.expect(mock.second()).andReturn(_somethingCustom_).anyTimes();

还不够好,尤其是对于有很多方法(很多样板)的接口(interface)。我需要转发行为,因为 real 实际上取决于其他模拟。

我希望像这样的事情由框架来处理,而不是由我自己的类来处理。这可以实现吗?

最佳答案

听起来你很可能应该为 first()second() 设置单独的接口(interface),如果 first() 的实现必须调用 second()。然后您也可以拆分实现,并在测试 first() 时模拟 second()。如果没有关于什么是 first()second() 的更具体示例,则很难确定。

在实现类上使用 EasyMock 来模拟 second() 调用可能 有效,但您似乎不想这样做无论如何都要这样做。这可能需要告诉 EasyMock 将对 first() 的调用传递给正常实现 - 我不确定。

另一种选择可能是将测试类中的实现子类化(作为嵌套类),允许您为了测试目的而仅覆盖 second()。虽然它很丑。

就我个人而言,我不喜欢为了测试其余部分而伪造类(class)的部分。我宁愿伪造一个类的所有依赖项。

关于java - 有什么办法可以代替动态方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5475851/

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