gpt4 book ai didi

java - PowerMockito : mock private method to throw private class

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

我有一个如下所示的类:

public class Foo {
public meth() {
try {
privMethod();
System.out.println("Yay!");
} catch (FooException e) {
System.out.println("Boo!");
}
}

private void privMethod() throws FooException {
//doOtherStuff
if (someCondition()) {
throw new FooException();
}
}

private class FooException extends Exception {
FooException(String message) { super(message); }
}
}

我想为此编写一个单元测试,使用 MockitoPowermock 。我知道我可以像这样模拟私有(private)方法:

Foo spy = PowerMockito.spy(new Foo())
PowerMockito.doNothing().when(spy, "privMethod");

但是我如何告诉它抛出异常呢?我知道它会是这样的:

Powermockito.doThrow(/*what goes here?*/).when(spy, "privMethod");

那里有什么?

请注意,异常是一个私有(private)内部类,因此我不能只执行 doThrow(new FooException()),因为 FooException 无法从单元测试。

最佳答案

一般来说,你就去吧。

Powermockito.doThrow(theThingToThrow)

去那里。例如 doThrow(new RuntimeException("should be throw")) 。或者更具体的异常,具体取决于您希望被测试的代码对异常执行什么操作。

但是当然:您想在那里实例化一个私有(private)类。这是你做不到的(很简单,请参阅 here 以了解非常复杂的方法)。从这个角度来看:您创建了一个非常难以测试的设计。答案是重新设计该设计,使其更易于测试。

最后一句警告:我认为您不需要为此使用 PowerMockito。 spy 使用普通的 Mockito 进行工作。

当没有硬性需要使用PowerMock(ito)版本时,就不要使用它们。时期。他们有自己的位置,但老实说:大多数情况下,需要 PowerMock(ito) 等于“难以测试代码”。

除此之外:查看私有(private)方法可以转化为测试实现细节。这也是尽可能避免的事情。

因此,换句话说:A)几乎不可能以有意义的方式测试上述代码。 B)这样做也是不好的做法(如问题中所设想的)。因此,这里的“最佳”解决方案是退一步并重新设计整个事情。是的,我是认真的。

关于java - PowerMockito : mock private method to throw private class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50949661/

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