【问题标题】:How to mock objects created inside method?如何模拟在方法内部创建的对象?
【发布时间】:2014-12-06 20:17:36
【问题描述】:

考虑一下

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)  

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

有什么想法吗?

【问题讨论】:

标签: java unit-testing junit mockito


【解决方案1】:

使用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 answer所说的那样。

希望对你有帮助

【讨论】:

    【解决方案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 注入工厂可能会更好(如果您要这样做)。

    【讨论】:

      猜你喜欢
      • 2017-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 2017-04-07
      • 1970-01-01
      相关资源
      最近更新 更多