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

时间:2014-10-11 22:59:11

标签: java unit-testing junit 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));
    }

}

我想嘲笑

new UserQueries(crudService)  

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

有什么想法吗?

2 个答案:

答案 0 :(得分:9)

使用PowerMock,您可以模拟构造函数。见example

我现在没有使用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回答的那样。

希望有所帮助

答案 1 :(得分: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注入工厂可能会更好(如果你打算这样做)。