考虑一下
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)
这样我就可以嘲笑它的行为
有什么想法吗?
答案 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注入工厂可能会更好(如果你打算这样做)。