【问题标题】:Exception handling inside fixture of test class?测试类夹具内的异常处理?
【发布时间】:2013-08-26 21:28:10
【问题描述】:

中的行会导致 ClassNotFoundException 被抛出,并且必须进行处理才能编译。如果我通过使用 try-catch 来解决编译错误,那么如果抛出异常,每个单元测试都将使用未初始化的实例。如果我在方法签名中添加throws 会发生什么?

@Test
public class PanelControllerTest {

    private PanelController panelController;

    @BeforeTest
    public void beforeTest() {

        panelController = <s>new PanelController();</s>

    }
}

我是测试夹具的新手,我假设这是测试类实例的正确方法。在测试夹具设置代码中处理异常的最佳方法是什么?

更新: 这似乎是从 PanelController 调用的异常的来源:

class DBAccess {
    public DBAccess(DBConnection dbConnection) throws ClassNotFoundException {
         Class.forName(Constants.jdbcDriver);
         ...
    }
}

【问题讨论】:

  • 我认为你需要弄清楚它为什么会抛出,并消除导致它抛出的条件。
  • 嗨,如果这是预期的行为,那么我会有一个测试用例来测试这个预期的行为。
  • 是每次都抛出异常,还是可以抛出异常,打乱单元测试?
  • @NathanielFord 我在我的问题中添加了“如果抛出异常”。只有当它碰巧不起作用时。
  • 更新:我更新了我的代码以显示异常发生的位置,正如@RobertHarvey 提到的那样。

标签: java unit-testing jdbc exception-handling


【解决方案1】:

正确的行为是捕获异常并使测试运行失败。

@BeforeTest
public void beforeTest() {
  try{
    panelController = new PanelController();
  } catch (Exception e) {
    fail("Test failed because dependency could not be instantiated. Exception was:"+e.getMessage());
  }
}

在理想情况下,您在运行测试时可能不会依赖数据库(因为很难管理它们的测试状态),而是使用模拟对象。尽管如此,如果您必须依靠它,最好在数据库出现故障时使测试运行失败,并将其作为直接故障浮出水面。

【讨论】:

  • 不错的答案!这是我需要做的。另外,我喜欢为非数据库测试使用模拟对象的想法。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多