问题:有没有办法使用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;
}
由于工厂代码相当简单,您甚至可能决定不为其编写自动化测试。但无论如何,测试工厂更多地(部分)是集成测试而不是单元测试;您可以简单地将应用程序的不同设置放在一起 - 一个包含相关库,另一个不包含相关库 - 并查看两者是否正常工作。
关于java - 单元测试库是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3862521/