如何对锁定语句进行单元测试?

g t*_*g t 8 c# unit-testing locking

我如何编写单元测试以确保获得锁定?

例如:

public void AddItem(object item)
{
    lock (_list)
    {
        _list.Add(item)
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有办法确保lock语句运行?

编辑:我不是要试图证明线程安全(我会假设),只是调用了lock()语句.

例如,我可以new object()通过在CreateObject()工厂函数中替换它来测试语句.

Jak*_*cki 9

单元测试多个线程总是很棘手,应该小心处理.

在你的情况下,我不打扰测试lock关键字,因为你没有为其编写测试new.

Assert.IsNotNull(new object());

此外,您似乎封装为线程不安全的集合,以使其线程安全.考虑使用线程安全的集合,而不是重新发明轮子.


tal*_*eth 4

就像测试任何其他东西一样:编写一个没有它就会失败的测试。换句话说,首先确定为什么要编写锁,然后编写一个测试来指定该原因。我认为原因是线程安全:如果是这样,请编写多线程测试。如果是其他原因,就进行测试。

如果您真的非常想测试调用锁而不是测试锁导致的行为,请封装:

public class MyLock : IDisposable
{
    private object _toLock;

    public MyLock(object toLock)
    {
        _toLock = toLock;
        Monitor.Enter(_toLock);
    }

    public virtual void Dispose()
    {
        Monitor.Exit(_toLock);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,您还必须创建一个可模拟工厂。对我来说似乎有点过头了,但也许在你的背景下这是有道理的。