我正在学习Mockito。在开始使用模拟对象之前,我不得不说更像集成测试一些单元测试,所以我有这样一个setUpBeforeClass(试验班):Junit/Mockito:选择运行模拟测试或集成测试
@BeforeClass
public static void setUpBeforeClass() throws Exception {
instance = new UserDataAccess();
instance.setDb(new MyDb());
}
现在用模拟对象是相似的很多,但是设置略微复杂一些:
@BeforeClass
public static void setupBeforeClass throws Exception {
instance = new UserDataAccess();
MyDb myDb = mock(MyDb.class);
when(...).thenReturn(...);
...
instance.setDb(myDb);
}
而且我有一个测试套件,用于在运行测试之前加载DB在一个众所周知的状态,这是由称为第一类测试完成该套件。
我在想,我不应该扔掉集成测试,所以我正在考虑将测试套件分成一个UnitTestSuite和一个IntegrationTestSuite。事实上,模拟测试并没有测试所有的东西,例如他们不测试查询是否正确。
此外,这两个套件之间的唯一区别将是初始DB重置和setUpBeforeClass()代码。复制和更改所有测试类只是为了更改方法是浪费。初始DB重置很容易跳过,我只是没有在单元测试套件中包含db重置测试类。
要拆分单元和集成测试你有什么建议?扩展所有原始类以覆盖静态方法,然后在套件中包含正确的类?
还是其他方法?你是怎么做的,或者你会怎么做?
Upvoted为关于'测试蠕变'的段落。集成测试和单元测试通常在使用模拟方面有所不同,单元测试涵盖单一类合同,集成测试覆盖(部分)用例与整个系统。 –
谢谢Derek,所以在实践中你说的是,运行与集成和单元测试相同的测试可能不是一个好主意,只是重复一种方法,因为我会错过测试的不同重点,而我或许过度设计了测试,所以我不妨将其与一些代码重复进行交换。它是否正确? – stivlo
是的,差不多。我确信有些人会不同意代码重复,但如果有助于保持清晰的话,我不介意有点重复。它非常依赖于你的测试。如果你无法花费30分钟时间来阅读和理解它们,那么它们就太复杂了。另一方面,如果在包含单元测试的类中看到4次或5次相同的设置,则可能将其重构为抽象或setup()方法。正如我所说,这是一个基于代码的个人通话。最好的指南是KISS。 – drekka