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

11

考虑一下这个

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));
    }

}

我想模拟

new UserQueries(crudService)  

有什么想法吗?

这样我就可以模拟它的行为了。


也许这个可以帮到你:http://docs.mockito.googlecode.com/hg/1.9.5/org/mockito/Spy.html - Arthur Julião
2个回答

11

使用PowerMock,可以对构造函数进行模拟。请参见示例

我现在没有IDE,但大致应该是这样的:

  UserQueries userQueries = PowerMockito.mock(UserQueries.class);
  PowerMockito.whenNew(UserQueries.class).withArguments(Mockito.any(CrudService.class)).thenReturn(userQueries);

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

@RunWith(PowerMockRunner.class)
@PrepareForTest(UserQueries .class)

如果你不能使用PowerMock,你就必须注入一个工厂,正如@Briggo回答中所说。

希望这可以帮到你。


似乎PowerMock只能与Junit4一起使用。 - xxks-kkk

2
您可以注入一个工厂来创建UserQueries。
public class UserManager {
private final CrudService crudService;
private final UserQueriesFactory queriesFactory; 

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

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

虽然这么做可能更好(如果你打算这样做的话),但最好将CrudService注入到工厂中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接