当前位置: 首页 > 知识库问答 >
问题:

表达式导致模拟存储库返回null

淳于禄
2023-03-14

我试图测试一个服务方法,但为了做到这一点,我必须模拟我的ReportRepository。除了对Include方法的调用使模拟返回为NULL外,其他操作都很好。

下面返回预期的报告:

var report = new Report();
var reportRepoMock = Substitute.For<IReportRepository>();
reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));

但该服务实际上执行以下操作:

var report = await reportRepo.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync();

问题是,当我在模拟中包含'include'方法时,返回的是null而不是预期的报告,因此我的测试以NullReferenceException:

var reportRepoMock = Substitue.For<IReportRepository>();
reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));
public class ReportRepository : IReportRepository
{
    private readonly IDbSet _dbSet;

    public ReportRepository(IDbContext context) {
        _dbSet = context.Set<Report>();
    }

    void Add(Report report) { ... }
    void Remove(Report report) { ... }
    ...

    public IReportQueryBuilder Query() {
        return new ReportQueryBuilder(_dbSet.AsQueryable());
    }
}

public class ReportQueryBuilder : IReportQueryBuilder
{
    private IQueryable<Report> _query;

    public ReportQueryBuilder(IQueryable<Report> query) {
        _query = query;
    }

    public IReportQueryBuilder ByReportType(ReportType reportType) {
        _query = _query.Where(m => m.ReportType == reportType);

        return this;
    }

    public IReportQueryBuilder Include<T>(Expression<Func<Report, T>> property) {
        _query = _query.Include(property);

        return this;
    }

    public async Task<Report> ToEntityAsync() {
        return await _query.FirstOrDefaultAsync();
    }
}

共有1个答案

蒋默
2023-03-14

想通了这个。而不是将模拟设置为:

 reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(m => m.Fields)
    .ToEntityAsync()
    .Returns(Task.FromResult(report));

我去了:

reportRepoMock.Query()
    .ByReportType(ReportType.DELQ)
    .Include(Arg.Any<Expression<Func<Report, Collection<ReportField>>>>())
    .ToEntityAsync()
    .Returns(Task.FromResult(report));
 类似资料:
  • 在我的Spring Boot应用程序(基于JHipster 4)中,我试图使用属性表达式根据Spring文档中描述的相关实体的属性来过滤我的查询:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.query-方法。查询属性表达式 我想得到所有的约会,在他们的约会计划中有一个特定的雇员帐户

  • 我试图获取一个列表从数据库和findAll()返回空列表。我有多个jpa存储库,但只有一个不工作。这是代码: 这就是实体: 当我调用product类别epository.findAll()时,它返回空列表,因此我在数据库中有许多条目。谢谢你的帮助!

  • 我正在编写一个lambda表达式来将给定的纬度和经度转换为地址。表达式应该以坐标为参数,并返回其相应的地址。但是,返回的值为null。以下是我的班级: 以下是logcat的输出: 以下是我的用法: 是类的对象,以下是相关接口: 当我尝试从相关适配器打印坐标时,它们会正确打印。因此,位置正在正确设置,但是当我试图从另一个类访问它时,它会显示字符串的空值。你能建议一个替代方法来从表达式中提取位置吗?

  • 此示例存储库有一个方法 现在不需要使用Robolectric来单元测试了吗?

  • 这是我要测试的类 这是测试类 当我做这个测试的时候 我创建这些类时参考了其他已有的代码,来自不同的地方,并且没有真正理解如何进行注释(部分原因是时间不够),所以如果有人能告诉我,不仅是如何修复,而且还有为什么我错了,我会非常感激的! 编辑: 我做了@Nikolas Charalambidis建议的更改(谢谢!),所以我的类现在看起来与 通过稍加搜索,从这个SO答案中,我觉得我不应该@autowir

  • 我已经创建了一个包含控制器、服务和存储库层的基本Rest API。我现在正在尝试为通过产品ID查找产品的服务层方法编写一个单元测试。但是,当我运行测试时,它会在我试图模拟存储库findById()方法的行中抛出一个NullPointerException。 服务层中的getProductById()方法如下所示: 我的服务层测试类: