我正在学习单元测试(采用类似 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));
}
我看到两个问题:
- 这些方法是相同的。
- 我在每个测试中测试了两种方法,如果存储失败,我会收到一条消息,指出检索有问题。
使用反射会将我的测试绑定(bind)到我的实现,我正在努力避免它。 更改界面以进行更好的测试很难与我的队友争论。
在这些情况下您采用什么方法? (这种情况有问题吗?)
最佳答案
您可以尝试将您的观点从编写“每个方法的(一组)测试”转变为您正在测试的类的“每个有用行为的测试”。
如果这个类既是数据的读取者又是数据的写入者,那么在测试检索行为时使用它的插入操作是有意义的,反之亦然。
我会测试没有项目、一个项目、多个项目、有一个特定项目、没有一个特定项目的情况。这些测试也会隐式测试存储方法。
Kevlin Henney 的演讲 programming with GUTs对此概念提供了很好的解释。
关于java - 如何在不测试同一个测试用例中的插入的情况下测试我的类的检索方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32610335/