如何为 类 编写使用硬件资源的单元测试?

How to write unit tests for classes which use hardware resources?

我创建了一个 class,它从 JSSC library 扩展并且使用低级通信方法(sendByte、sendString 等)。我想通过 JUnit 对其进行测试,但我不太清楚该怎么做。

例如,让我们看看下面的方法:

public void openConnection() throws SerialPortException {
  serialPort.openPort();
  configureConnectionParameters(serialPort);
  configureReadListener(serialPort);
}

为了确保该方法正常工作,我需要一个实际的硬件设备来查看端口是否正确打开以及在配置过程中是否没有抛出异常。但是在单元测试期间使用外部资源通常被认为是一种不好的做法,所以我开始想知道是否有解决此类问题的方法(也许是模拟硬件?)。

或者,我是否必须对其进行单元测试?

您可能应该更改 class 的结构并注入 serialPort.

通过这种方式,您可以在单元测试期间模拟注入的串行端口,并另外创建具有较少隐藏依赖项的更清晰的代码。

示例:

public class PortHandler {

    private final SerialPort serialPort;

    public PortHandler(SerialPort serialPort) {
      this.serialPort = serialPort;
    }

    [...]

    public void openConnection() throws SerialPortException {
      serialPort.openPort();
      configureConnectionParameters(serialPort);
      configureReadListener(serialPort);
    }

    [...]
}

@Test
public void testShouldOpenPortOnOpenConnection()
      throws Exception {

    SerialPort mockedPort = mock(SerialPort.class);
    PortHandler portHandler = new PortHandler(mockedPort);
    portHandler.openConnection();

    verify(mockedPort, times(1)).openPort();
}

资源:

  • 示例中使用的模拟框架:Mockito