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

Java 如何模拟在方法内部创建的对象?,java,unit-testing,junit,mockito,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&g

想想这个

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

}
这样我就可以模仿它的行为


有什么想法吗?

您可以注入一个创建用户查询的工厂

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 CrudService;
私有最终用户查询工厂查询工厂;
@注入
公共用户管理器(@Nonnull final CrudService CrudService,userquerysfactory querysfactory){
this.crudService=crudService;
this.queriesFactory=queriesFactory;
}
@非空
公共列表getUsersByState(@Nonnull最终字符串状态){
返回UserPresentation.getUserPresentations(queryFactory.create(crudService).getUserByState(state));
}
}

尽管将CrudService注入工厂可能更好(如果您打算这样做)

使用,您可以模拟构造函数。看

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

  UserQueries userQueries = PowerMockito.mock(UserQueries.class);
  PowerMockito.whenNew(UserQueries.class).withArguments(Mockito.any(CrudService.class)).thenReturn(userQueries);
您需要使用
PowerMockRunner
运行测试(将这些注释添加到测试类):

如果不能使用PowerMock,就必须注入一个工厂,正如它所说的@Briggo answer

希望有帮助

也许这可以帮助:
  UserQueries userQueries = PowerMockito.mock(UserQueries.class);
  PowerMockito.whenNew(UserQueries.class).withArguments(Mockito.any(CrudService.class)).thenReturn(userQueries);
@RunWith(PowerMockRunner.class)
@PrepareForTest(UserQueries .class)