Я пытаюсь написать модульный тест (используя JMockit), который проверяет, что методы вызываются в соответствии с частичным порядком. Конкретный вариант использования — убедиться, что определенные операции вызываются внутри транзакции, но в более общем плане я хочу проверить что-то вроде этого:
- Вызывается метод
beginTransaction
. - Методы с
operation1
поoperationN
вызываются в любом порядке. - Вызывается метод
endTransaction
. - Метод
someOtherOperation
вызывается за некоторое время до, во время или после транзакции.
Похоже, что API-интерфейсы ожиданий и проверок не в состоянии справиться с этим требованием.
Если у меня есть @Mocked BusinessObject bo
, я могу убедиться, что правильные методы вызываются (в любом порядке) следующим образом:
new Verifications() {{
bo.beginTransaction();
bo.endTransaction();
bo.operation1();
bo.operation2();
bo.someOtherOperation();
}};
при желании сделайте его FullVerifications
, чтобы убедиться, что нет других побочных эффектов.
Чтобы проверить ограничения порядка, я могу сделать что-то вроде этого:
new VerificationsInOrder() {{
bo.beginTransaction();
unverifiedInvocations();
bo.endTransaction();
}};
но это не касается случая someOtherOperation
. Я не могу заменить unverifiedInvocations
на bo.operation1(); bo.operation2()
, потому что это приводит к общему порядку вызовов. Правильная реализация бизнес-метода может вызвать bo.operation2(); bo.operation1()
.
Если я сделаю это:
new VerificationsInOrder() {{
unverifiedInvocations();
bo.beginTransaction();
unverifiedInvocations();
bo.endTransaction();
unverifiedInvocations();
}};
затем я получаю ошибку «Нет непроверенных вызовов», когда someOtherOperation
вызывается перед транзакцией. Попытка bo.someOtherOperation(); minTimes = 0
тоже не работает.
Итак: есть ли чистый способ указать требования частичного упорядочения для вызовов методов с использованием API ожиданий/проверок в JMockIt? Или мне нужно использовать MockClass
и вручную отслеживать вызовы, а-ля:
@MockClass(realClass = BusinessObject.class)
public class MockBO {
private boolean op1Called = false;
private boolean op2Called = false;
private boolean beginCalled = false;
@Mock(invocations = 1)
public void operation1() {
op1Called = true;
}
@Mock(invocations = 1)
public void operation2() {
op2Called = true;
}
@Mock(invocations = 1)
public void someOtherOperation() {}
@Mock(invocations = 1)
public void beginTransaction() {
assertFalse(op1Called);
assertFalse(op2Called);
beginCalled = true;
}
@Mock(invocations = 1)
public void endTransaction() {
assertTrue(beginCalled);
assertTrue(op1Called);
assertTrue(op2Called);
}
}
someOtherOperation
следует проверять в обычном блоке перед упорядоченным блоком проверки, который содержит вызовunverifiedInvocations()
. Однако в настоящее время JMockit не поддерживает эту конкретную комбинацию. Я собираюсь исправить это для версии 0.999.9. - person Rogério   schedule 04.05.2011