如何对以下方法进行单元测试

卡洛斯·桑切斯(Carlos Sanchez)

我正在参加软件测试课程,这是我的计算机科学选修课程的一部分。

现在,我们正在测试由研究生制作的软件,它的确不是很漂亮,我正在测试的该类具有以下方法,一开始它似乎使用了线程,并且似乎在创建一个监听器。听一个端口,有人可以解释一下这段代码在做什么吗?我将如何测试此功能?

public void startServer() throws IOException  {
  ServerSocket ss = new ServerSocket(portNum);
  while(true) {
    Socket s = ss.accept();
    Thread t = new Thread(new ConnectionHandler(s));
    t.start();
  }
}
幽灵猫

简而言之:该代码创建了一个新的ServerSocket来侦听特定端口;“请求”成为该端口上,它启动一个线程来处理该客户端。

该代码的问题:

  • 它运行一阵while(true)循环;所以这种方法是应该再回来
  • 除此之外,它以一种难以测试的方式编写基本上是因为您new在该方法中有这两个调用

我将解释如何克服第二部分。然后谈谈第一点。关于“测试”本身,您有两种选择:

  1. 锁定PowerMock(丑陋);也许Mockito间谍可能会有所帮助;嘲弄到新的呼叫。(Mockito还可以,但是PowerMock在我眼中并不是那么多)
  2. 首选:更改代码以使其易于测试;然后使用依赖项注入。

喜欢:

public class Server {
  private final SocketFactory socketFactory;
  private final ThreadFactory threadFactory;

  public Server() {
    this(new SocketFactory(), new ThreadFactory());
  }

  Server(SocketFactory socketFactory, ...
    this.socketFactory = socketFactory...

public void startServer() throws IOException
{
    ServerSocket ss = socketFactory.createSocketFor(portNum);
    while(true)
    {
        Socket s = ss.accept();
        Thread t = threadFactory.newThreadFor(new ConnectionHandler(s));
        t.start();
    }
}

现在……一切都超级简单:你可以使用第二个受包保护的 ctor插入模拟工厂;然后您可以配置/验证这些工厂是否可以看到您期望的呼叫。

当然,这看起来像是“更多”的工作。现在您必须创建另外两个类(实际上您可能会使用接口impl类)。但问题是:您最终会得到更好的设计,这不仅更易于测试,而且更易于维护和增强。

然后:创建“裸机”线程不再是一种好习惯。(特别是不是在while-true循环中;如果您仍然在搜索错误),您应该查看一些ThreadPool类。以确保您不会不断创建线程。那些是“昂贵的”;您应该非常喜欢“重用”线程。还有一些库可以帮助您!

好,回到另一个问题:到目前为止,由于while(true),您根本无法合理地对该方法进行单元测试。您看到,当您模拟该ServerSocket时,对accept()的调用将不会阻塞;并且您遇到了一些创建模拟线程的无限循环。

所以:你必须改装此代码(以允许外部停止)...或者你可以设置的模拟的ThreadFactory返回一个嘲笑线程; 这引发了一些特定的异常。然后,您的单元测试只是希望抛出该异常-作为间接“证明”您所期望的事情确实发生了。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何对POST方法进行单元测试

如何对空方法进行单元测试

如何对依赖于springBoot applicationContext的单元测试方法进行单元测试?

如何对调用 void 方法的方法进行单元测试?

角度单元测试:如何对.map()进行单元测试?

如何对带有枚举参数的方法进行单元测试?

如何对导致操作的方法进行单元测试

如何使用Mockito模拟静态方法以进行单元测试

如何对与System(或Android)类交互的方法进行单元测试

如何对__init __()函数中调用的方法进行单元测试?

如何对执行异步方法的RelayCommand进行单元测试?

如何对该doFilter()方法进行单元测试?

如何对发布方法进行泽西单元测试

如何对无参数的void方法进行单元测试

如何对使用Part类型参数的方法进行单元测试?

如何对反应组件的方法进行单元测试?

如何对时间相关的方法进行单元测试?

如何对React Component的shouldComponentUpdate方法进行单元测试

如何在python中对POST方法进行单元测试?

您如何对私有方法进行单元测试?

如何在模拟方法中对函数进行单元测试

如何对字符串扩展方法进行单元测试

如何对返回Promise的Async方法进行单元测试

我将如何对该方法进行单元测试?

如何对MatDialog(角材料)进行单元测试的正确方法?

如何对依赖服务的组件的方法进行单元测试?

如何使用 JustMock lite 对删除方法进行单元测试

如何对返回 Action<AuthenticationOptions> 的方法进行单元测试?

如何创建以下方法的模拟测试