gpt4 book ai didi

java - 当方法是私有(private)时,Power Mockito 抛出 "Unfinished stubbing"错误,但当方法 protected 时不会抛出错误

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

我正在尝试测试使用正确的参数调用“reallyCoolMethod”方法。问题是 stub “getSillyString”方法会导致错误。当方法“getSillyString”为私有(private)时,测试将在第二个 doReturn 上失败:

doReturn("superSilly").when(spy, "getSillyString", 5, false);

但是当该方法受到保护时,测试就会通过。错误是:

org.mockito.exceptions.misusing.UnfinishedStubbingException: 
Unfinished stubbing detected here:
-> at org.powermock.api.mockito.internal.PowerMockitoCore.doAnswer(PowerMockitoCore.java:36)

E.g. thenReturn() may be missing.
Examples of correct stubbing:
when(mock.isOk()).thenReturn(true);
when(mock.isOk()).thenThrow(exception);
doThrow(exception).when(mock).someVoidMethod();
Hints:
1. missing thenReturn()
2. you are trying to stub a final method, you naughty developer!

这是正在测试的类:

import java.util.Random;

@Singleton
public class FooBar {

@Inject
public FooBar(Foo foo, Bar bar) {
this.foo = foo;
this.bar = bar;
}

@POST
@Path("foos/")
public fooAction createFoo() {

word1 = getSillyString(4, true);
word2 = getSillyString(5, false);

int id = reallyCoolMethod(word1,word2);
}

private String getSillyString(int size, boolean allCaps){
}
}

这是测试:

import static org.mockito.Mockito.verify;

import org.junit.Test;
import org.mockito.Mockito;

import static org.powermock.api.mockito.PowerMockito.doReturn;
import static org.powermock.api.mockito.PowerMockito.spy;

import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.modules.junit4.PowerMockRunner;

@RunWith(PowerMockRunner.class)
public class FooTest {

@Test
public void testCreateFoo() throws Exception {

Foo foo = Mockito.mock(Foo.class);
Bar bar = Mockito.mock(Bar.class);
FooBar resource = new FooBar(foo, bar);
FooBar spy = spy(resource);

doReturn("reallySilly").when(spy, "getSillyString", 4, true);
doReturn("superSilly").when(spy, "getSillyString", 5, false);

doReturn(1).when(spy).reallyCoolMethod(Mockito.anyString(),Mockito.anyString());
spy.createFoo();
verify(spy).reallyCoolMethod(Mockito.eq("reallySilly"),Mockito.Eq(superSilly));
}

}

最佳答案

真正的答案是:您通过将该类的基本元素放入私有(private)方法中来创建难以测试的代码。

换句话说:如果那件事对您的生产代码如此重要,那么更好的答案是将底层功能放在自己的类中。因此,您创建一些界面:

public interface SillyService {
public String getSillyString();
}

然后使用依赖注入(inject)为需要此服务的类提供“某种”实现。

想要模拟私有(private)方法始终是糟糕的设计决策的结果。因此,答案不在于 Mockito 或 PowerMock,而在于退后一步并改进该设计。

对于初学者来说,可以观看这些 videos学习如何编写可测试代码。

除此之外:请注意,PowerMock 会影响您可以使用 Mockito 执行的操作 - 因为 PowerMock 附带了 Mockito 的大部分后台版本。我个人的建议:摆脱对 PowerMock 的需求;而只是使用最新/最好版本的 Mockito。

关于java - 当方法是私有(private)时,Power Mockito 抛出 "Unfinished stubbing"错误,但当方法 protected 时不会抛出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42079691/

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