如何模拟在方法内创建的对象?

day*_*mer 7 java junit unit-testing mockito

考虑一下

public class UserManager {
    private final CrudService crudService;

    @Inject
    public UserManager(@Nonnull final CrudService crudService) {
        this.crudService = crudService;
    }

    @Nonnull
    public List<UserPresentation> getUsersByState(@Nonnull final String state) {
        return UserPresentation.getUserPresentations(new UserQueries(crudService).getUserByState(state));
    }

}
Run Code Online (Sandbox Code Playgroud)

我想嘲笑

new UserQueries(crudService)  
Run Code Online (Sandbox Code Playgroud)

这样我就可以嘲笑它的行为了

有任何想法吗?

tro*_*oig 9

使用PowerMock,您可以模拟构造函数.见例子

我现在不使用IDE,但是会是这样的:

  UserQueries userQueries = PowerMockito.mock(UserQueries.class);
  PowerMockito.whenNew(UserQueries.class).withArguments(Mockito.any(CrudService.class)).thenReturn(userQueries);
Run Code Online (Sandbox Code Playgroud)

您需要运行测试PowerMockRunner(将这些注释添加到测试类):

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserQueries .class)
Run Code Online (Sandbox Code Playgroud)

如果你不能使用PowerMock,你必须注入一个工厂,就像@Briggo回答的那样.

希望能帮助到你