如何对使用线程的方法进行单元测试?

ant*_*nth 2 c# java junit nunit unit-testing

如何为使用线程的方法编写单元测试。

在下面的示例中如何测试 someMethod 方法?

    public class SomeClass {

    private final SomeOtherClass someOtherClassInstance = IoC.getInstance(SomeOtherClass.class);

    private final ExecutorService executorService = Executors.newCachedThreadPool();

    public void someMethod() {
        executorService.execute(new Runnable() {
            @Override
            public void run() {
                someOtherClassInstance.someOtherMethod();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

为此,java 和 .net 中是否有任何解决方案?

Rob*_*yth 7

您的问题是“什么是单元测试”(UT)。UT 只是自动化测试的一种形式。在这种情况下,您的问题意味着代码调用操作系统来启动一个线程,因此根据定义,测试它的测试不会是单元测试,而可能是集成测试。

为什么我用看起来像语义的东西来打扰你是因为理解测试的意图使得编写测试和构建代码变得如此容易。可用的代码量大于可测试的代码量。

那么,如何将此代码更改为可进行单元测试(我将跳过“为什么要麻烦”)...

C# 中的单元测试测试单一类型(您的类)……重要的是(根据定义)没有别的。所以你的代码需要反映这一点。您要测试的是,当我调用 ABC 时,它会执行这些操作。东西包括启动一个线程。因此,您要测试该方法来启动一个调用的线程。这里的基本原理是您的应用程序需要一个线程,这就是您的断言。

又怎样?为线程创建创建一个代理,可能还有一个工厂。然后您可以在单元测试中断言它被调用以及它是如何被处理的。听起来很难,但当你养成习惯时真的很容易。

顺便说一句,Resharper 为操作系统类型(例如线程)创建代理。在他们的帮助中查看委派成员的内容。如果您不使用 Resharper,则应该使用。

是的,我知道这不是您想要的答案,但相信我,这是您需要的答案。

我发现考虑以下类别的测试很有用:

  • 单元测试
  • 集成测试(或者可能是子系统测试)
  • 功能测试(例如 UI/应用程序/UAT 测试)