Java 测试异步API,具有给定的When-Then样式,多个When-Then?

Java 测试异步API,具有给定的When-Then样式,多个When-Then?,java,unit-testing,asynchronous,junit,assertj,Java,Unit Testing,Asynchronous,Junit,Assertj,我知道建议在测试中使用“单一断言”,或者在BDD范式中使用一组“何时”和“然后” 我在想,在测试异步API时,是否可以放松这个假设。首先必须发出请求,然后完成 大概是这样的: @Rule public final Java6JUnitSoftAssertions softly = new Java6JUnitSoftAssertions(); @Test public void setLessStrictCriterionGivenAllFetchesCompleted() { giv

我知道建议在测试中使用“单一断言”,或者在BDD范式中使用一组“何时”和“然后”

我在想,在测试异步API时,是否可以放松这个假设。首先必须发出请求,然后完成

大概是这样的:

@Rule
public final Java6JUnitSoftAssertions softly = new Java6JUnitSoftAssertions();

@Test
public void setLessStrictCriterionGivenAllFetchesCompleted() {
    givenRepoWithCriterion(new MockCriterion(2));
    givenAllFetchesCompleted();

    // When I set a less strict criterion of ">= 1"
    final MockCriterion criterionMinValue1 = new MockCriterion(1);
    itemRepo.setCriteriaAndFetch(criterionMinValue1);

    // Then there is a fetch request in the queue, to fetch ">= 1"
    assertQueue(criterionMinValue1);
    // And there are loading items
    assertRepoItems(null, null, null);
    assertAll();

    // -------- Notice second group of When-Then starts here --------

    // When the fetch finishes
    fetcher.yieldFetch();

    // Then item list is 1 2 3
    assertRepoItems(1, 2, 3);
}
请注意,有两组When-Then

assertAll()
用于强制断言第一组AssertJ软断言

在实际的实现中,通常通过HTTP进行抓取,但是对于测试,有一个模拟的抓取器,并且通过
fetcher.yieldFetch()模拟抓取的完成

<强>你认为整体结构是写这样的测试的好方法吗?< /强>


还有其他/更好的方法吗?

使用模拟对象来模拟用户行为似乎不是很好。BDD真的是一个“东西”吗?还是您更关心依赖于异步行为的高级集成测试?谢谢您的评论。事实是,我得到了一个评论,在以前的版本中,说“使用给定/何时/然后”和“每个测试一个断言”。所以我正在努力适应。审稿人不容易回答我的问题,所以我有些即兴发挥。我想我也可以使用Arrange/Act/Assert来代替Given/When/Then。最后,这是一个单元测试,不是集成测试。@sisyphus:Btw,模拟不是模拟用户行为,而是模拟通过HTTP获取。我认为你的方法是可以的,只要你对这个“工作流”的第一部分有一个单独的测试。但是在这种情况下,这个测试不应该重复另一个测试的断言。谢谢你的评论。向上投票。你能把这两个单独的测试的好处写下来吗?另一方面,成本似乎是一定数量的重复和测试次数的2倍。。。