繁体   English   中英

对库是否存在进行单元测试

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM