java - 如何在不测试同一个测试用例中的插入的情况下测试我的类的检索方法?

标签 java unit-testing tdd

我正在学习单元测试(采用类似 TDD 的方法)。 我正在创建一个封装集合的类,它有 3 个方法:

  • 商店
  • 检索所有文档
  • 有元素

我创建了一个测试:testRetrieveWhenEmpty,它是这样的:

@Test
public void testRetrieveAllDocumentsWhenEmpty() {
    List<String> storedDocs = state.retrieveAllDocs();

    assertNotNull(storedDocs);
    assertEquals(0, storedDocs.size());
}

然后我让它通过了。

现在我想创建一个 testRetrieveAllDocumentsWhenNotEmpty,它应该是这样的:

@Test
public void testRetrieveAllDocumentsWhenNotEmpty() {
    state.store("test") //This is the only api point that I can use to insert things
    List<String> storedDocs = state.retrieveAllDocs();

    assertNotNull(storedDocs);
    assertEquals(1, storedDocs.size());
    assertEquals("test", storedDocs..get(0));
}

但是现在我要实现store方法,所以我创建了如下测试方法:

@Test
public void testStoreDocument() {
    state.store("test")
    List<String> storedDocs = state.retrieveAllDocs(); //This is the only api point I can use to see the content

    assertNotNull(storedDocs);
    assertEquals(1, storedDocs.size());
    assertEquals("test", storedDocs.get(0));
}

我看到两个问题:

  1. 这些方法是相同的。
  2. 我在每个测试中测试了两种方法,如果存储失败,我会收到一条消息,指出检索有问题。

使用反射会将我的测试绑定(bind)到我的实现,我正在努力避免它。 更改界面以进行更好的测试很难与我的队友争论。

在这些情况下您采用什么方法? (这种情况有问题吗?)

最佳答案

您可以尝试将您的观点从编写“每个方法的(一组)测试”转变为您正在测试的类的“每个有用行为的测试”。

如果这个类既是数据的读取者又是数据的写入者,那么在测试检索行为时使用它的插入操作是有意义的,反之亦然。

我会测试没有项目、一个项目、多个项目、有一个特定项目、没有一个特定项目的情况。这些测试也会隐式测试存储方法。

Kevlin Henney 的演讲 programming with GUTs对此概念提供了很好的解释。

关于java - 如何在不测试同一个测试用例中的插入的情况下测试我的类的检索方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610335/

相关文章:

php - 在 PHPUnit 中测试工作链接

reactjs - 如何使用jest和enzyme测试react中的API调用?

ruby - 使属性始终为数组的最佳方法?

java - 为什么来自网络的图像在滚动时会锁定我的 ListView UI?

java - 用包含反斜杠 (\) 的字符串替换字符串的最佳方法

unit-testing - 使用假货或模拟进行单元测试?

javascript - $httpBackend.flush 在服务抛出错误时失败

java - 如何配置依赖于ejb jar的war并结合创建ear文件

java - 当其他fragment中的数据发生变化时如何刷新recyclerview适配器?

ios - 单元测试按钮单击不起作用