java - 单元测试库是否存在

标签 java unit-testing junit classpath classloader

问题:有没有办法使用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/

相关文章:

java - 合并 JTable 中的列

java - java中的点对点文件传输

unit-testing - 在 AAA 单元测试语法中混合使用 Assert 和 Act

java - 当方法调用实际返回某些东西时,有没有办法让 Mockito doNothing()

unit-testing - 测试 Storm bolt 和喷口

android - 无法使用 Android Test Orchestrator 运行参数化测试

java - 构建项目时如何让 Intellij IDEA 调用 wsimport?

java - 如何从 Excel 中的数组列表中收集引用

python - 在单元测试中创建后可以更新用户对象的属性吗?

java - 如何从使用 Google @Inject 的 Singleton 类调用非静态公共(public)方法