Абстрактные классы поблочного тестирования в Groovy

Опция B использует объект, который будет защищен для создания критического раздела. В некоторых случаях это более ясно передает намерение. Если используется последовательно, это гарантирует, что только один критический раздел для защищенного объекта будет активен за один раз:

lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}
lock (m_Hash)
{
    // Across all threads, I can be in one and only one of these two blocks
    // Do something with the dictionary
}

Опция A менее строга. Это использует вторичный объект создать критический раздел для объекта, который будет защищен. Если несколько вторичных объектов используются, возможно иметь больше чем один критический раздел для защищенного объекта, активного за один раз.

private object m_LockerA = new object();
private object m_LockerB = new object();

lock (m_LockerA)
{
    // It's possible this block is active in one thread
    // while the block below is active in another
    // Do something with the dictionary
}
lock (m_LockerB)
{
    // It's possible this block is active in one thread
    // while the block above is active in another
    // Do something with the dictionary
}

Опция A эквивалентна Опции B при использовании только одного вторичного объекта. До чтения кода намерение B Опции более ясно. При защите больше чем одного объекта Опция B не является действительно опцией.

9
задан Matthew Sowders 10 July 2009 в 06:55
поделиться

1 ответ

One cool thing about groovy (among many) is that you can use a map of method names with closures as values to mock out a class. This includes abstract classes.

abstract class Foo {
    def foo() {
       return bar() + 1
    }    

    abstract int bar()
}

def fooInst = [bar: {-> return 1 }] as Foo
assert 2 == fooInst.foo()
10
ответ дан 3 November 2019 в 01:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: