[英]Unit testing both the presence/absence of a library
问题: 是否可以使用ClassLoader
来测试要检查的库的存在与否?
我有一些代码,如果有的话,它将使用特定的库,否则,将使用一些嵌入式代码。 它工作正常,但是我不确定如何在同一运行中对两种情况进行单元测试,或者甚至不可能。 目前,我的单元测试仅检查一种情况,因为该库位于主类路径中或不在主类路径中。
我用来检查库可用性的代码基本上是:
boolean available;
try {
Class.forName("net.sf.ehcache.CacheManager");
available = true;
} catch (ClassNotFoundException e) {
available = false;
}
如果可以简化单元测试,我可能会改变其完成方式。
您正在尝试同时做两件事:
将两个任务分成不同的测试可以简化问题。 因此,我会将代码的两个版本实现为两个策略,然后将检查类路径并创建必要策略的代码放入工厂(方法)。 然后可以独立于类装入器和类路径设置对这两种策略进行单元测试:
interface MyStrategy {
public void doStuff();
}
class MyLibraryUsingStrategy implements MyStrategy {
public void doStuff() {
// call the library
}
}
class MyEmbeddedStrategy implements MyStrategy {
public void doStuff() {
// embedded code
}
}
在单元测试中,您可以简单地创建和测试以下两种具体策略:
@Test
void testEmbeddedStrategy() {
MyStrategy strategy = new MyEmbeddedStrategy();
strategy.doStuff();
// assert results
}
创建适当策略的简单工厂方法:
MyStrategy createMyStrategy() {
MyStrategy strategy;
try {
Class.forName("net.sf.ehcache.CacheManager");
strategy = new MyLibraryUsingStrategy();
} catch (ClassNotFoundException e) {
strategy = new MyEmbeddedStrategy();
}
return strategy;
}
由于工厂代码相当琐碎,因此您甚至可以决定不为其编写自动化测试。 但是无论如何,对工厂进行的测试比单元测试更多(一部分)在集成测试中。 您可以简单地将应用程序的不同设置放在一起-一个带有相关库,另一个不带有相关库-并确保两者都能正常运行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.