如何模拟外部库的对象?

时间:2019-04-27 09:14:10

标签: java mockito powermockito

我有以下要测试的方法:

    public String createUser(Keycloak keycloak) {
        final Response response = keycloak.realm(this.realm).users().create(this.toUserRepresentation());
        String userId = response.getLocation().getPath().replaceAll(".*/([^/]+)$", "$1");
        return userId;
    }

我已经尝试过了,但是getPath()总是返回一个空字符串。

@PrepareForTest(URI.class)
@RunWith(PowerMockRunner.class)
class UserTest {

    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private Keycloak keycloak;

    @Mock
    private Response response;

    @Test
    public void createUserTest() throws Exception {
        URI uri = PowerMockito.mock(URI.class);

        when(uri.getPath()).thenReturn("https://myserver/myid[\r][\n]");
        when(response.getLocation()).thenReturn(uri);
        when(keycloak.realm(any()).users().create(any())).thenReturn(response);


        assertEquals("myid", user.createUser(keycloak));
    }

}

我应该如何模拟URI.getPath()以使其返回预期值?

1 个答案:

答案 0 :(得分:0)

您可能需要在@PrepareForTest批注中包含要测试的类。例如:

@PrepareForTest({URI.class, User.class})

然后uri.getPath()将返回一个非空值。


请注意,您测试的URI绝不会评估为仅“ myid”,它还将包含“ [\ r] [\ n]”。

("https://myserver/myid[\r][\n]").replaceAll(".*/([^/]+)$", "$1")