PowerMock 多个匹配构造函数;(可变长度数组构造函数与无参数构造函数)



我正在尝试在 ResourceConfig.class 中模拟没有参数的构造函数。碰巧 ResourceConfig 有两个构造函数:(以及其他构造函数(:

public ResourceConfig()
public ResourceConfig(Class... class)

PowerMock (1.7.3( 无法获得正确的构造函数。我认为这是一个错误;但也许它有一个解决方案(?

法典:

import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import static org.powermock.api.mockito.PowerMockito.mock;
import static org.powermock.api.mockito.PowerMockito.whenNew;
@RunWith(PowerMockRunner.class)
@PrepareForTest( ResourceConfig.class )
public class StackOverflowTest {

  @Test
  public void toStackOvflow2() throws Exception {
    ResourceConfig resConf = mock(ResourceConfig.class);
    whenNew(ResourceConfig.class).withNoArguments().thenReturn(resConf);
    //WHATEVER...
  }
}

这会产生:

org.powermock.reflect.exceptions.TooManyConstructorsFoundException: 找到几个匹配的构造函数,请指定参数 参数类型,以便 PowerMock 可以确定您使用的是哪种方法 指。类中的匹配构造函数 org.glassfish.jersey.server.ResourceConfig 是:
org.glassfish.jersey.server.ResourceConfig( (
org.glassfish.jersey.server.ResourceConfig( [Ljava.lang.Class;.类 (

在 org.powermock.reflect.internal.ConstructorFinder.throwExceptionWhenMultipleConstructorMatchesFound(ConstructorFinder.java:89( ...

有什么想法吗?

您可以禁止显示多个构造函数,例如:

@Test
public void toStackOvflow2() throws Exception {
    ResourceConfig resConf = mock(ResourceConfig.class);
    // suppress TooManyConstructorsFoundException
    MemberModifier.suppress(MemberMatcher.constructorsDeclaredIn(ResourceConfig.class));
    whenNew(ResourceConfig.class).withNoArguments().thenReturn(resConf);
    // verifying that the expected ResourceConfig instance is returned when using the default ctor ...
    assertSame(resConf, new ResourceConfig());
}

此测试通过:

  • 电源模拟 1.7.3
  • 泽西岛 2.26

File可以接收StringUri的类的示例:

whenNew(File.class).withParameterTypes(String.class).withArguments(any(String.class)).thenReturn(mockFile);

最佳方法(如果您知道本例中的字符串值(:

whenNew(File.class).withArguments(eq("SOME STRING")).thenReturn(mockFile);

相关内容

  • 没有找到相关文章

最新更新