gpt4 book ai didi

java - Java 中的私有(private)方法 stub

转载 作者:行者123 更新时间:2023-12-02 07:51:10 24 4
gpt4 key购买 nike

我正在测试一个函数,该函数接受多个参数,并根据它们的值调用不同的私有(private)方法。

我想检查该函数是否始终调用正确的私有(private)方法。

因为我知道私有(private)方法会做什么,所以我可以检查最终结果,但能够直接检查是否调用了正确的函数会更方便,因为我已经测试了私有(private)方法。

有没有办法用 stub 替换私有(private)方法?

最佳答案

是的,有一些模拟库可以让你做到这一点。一是PowerMock 。来自他们的private method tutorial ,你需要这样的东西:

@RunWith(PowerMockRunner.class)
@PrepareForTest(MyUnit.class)
public class TestMyUnit {

@Test
public void testSomething() {
MyUnit unit = PowerMock.createPartialMock(MyUnit.class, "methodNameToStub");
PowerMock.expectPrivate(unit, "methodNameToStub", param1).andReturn(retVal);

EasyMock.replay(unit);

unit.publicMethod(param1);

EasyMock.verify(unit);

}

}

但是,我自己真的不同意这种做法。您的单元测试应该测试输入、输出和副作用,仅此而已。通过确保正确调用私有(private)方法,您所做的就是防止您的代码被轻易重构。

换句话说,如果您想改变您的单位的工作方式,该怎么办?执行此操作的安全方法是确保代码经过(通过)测试,然后重构代码(可能包括更改调用的内部方法),然后再次运行测试以确保没有破坏任何内容。使用您的方法,这是不可能的,因为您的测试测试的是确切的实现,而不是单元本身的行为。重构几乎总是会破坏测试,那么测试真正给你带来了多少好处?

大多数情况下,您会想要这样做,因为您实际上将这些私有(private)方法本身视为一个单元(这听起来像您,因为您说您已经在直接测试这些私有(private)方法了!)。如果是这种情况,最好将该逻辑提取到自己的类中,对其进行测试,然后在其余代码中与该新单元的模拟/ stub 版本进行交互。如果您这样做,您的代码将具有更好的结构,并且您无需依赖 PowerMock 的巫术魔法。 Michael Feathers 的 Working Effectively with Legacy Code 是进行此类重构的绝佳引用。 .

关于java - Java 中的私有(private)方法 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10213570/

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