whatnew not working:InvalidUseOfMatcfhers异常

时间:2014-12-18 18:25:23

标签: unit-testing junit powermock

我正试图模仿以下电话:

token = new String(Base64.decodeBase64(token), "UTF-8");

以下给出了

@Test(expected = InternalServiceException.class)
public void testGetDecodedVlsAuthorizationTokenWithException() throws Exception {
    PowerMockito.whenNew(String.class).withArguments(any(byte[].class), String.class).thenThrow(new UnsupportedEncodingException());
    brazilConfigurationManager.getDecodedVlsAuthorizationToken();
}

我在@PrepareForTest(BrazilConfigurationManager.class)部分下使用了whatNew建议的here

在此我得到InvalidUseOfMatchersException。

我也试过

PowerMockito.whenNew(String.class).withAnyArguments().thenThrow(new UnsupportedEncodingException());

但这也行不通。

关于我缺少什么的任何建议。

1 个答案:

答案 0 :(得分:1)

String.class中的withArguments参数替换为行中的eq(String.class)PowerMockito.whenNew(String.class).withArguments(any(byte[].class), String.class).thenThrow(new UnsupportedEncodingException());

当有许多可用的构造函数(如本例所示)时,为了获取特定的构造函数,那么你需要使用withParameterTypes找到特定的构造函数,如下所示:

PowerMockito.whenNew(String.class)
    .withParameterTypes(byte[].class, String.class)
    .withArguments(any(byte[].class), eq(String.class))
    .thenThrow(new UnsupportedEncodingException());

在参数中使用匹配器时,所有参数都必须是匹配器或不匹配。这意味着你不能混淆像any(Some.class)这样的匹配器和像String.class这样的真实参数。因此,您可以通过将匹配器包装在eq匹配器中来使用匹配器来实现真正的参数。