Как утверждать, что унаследованные методы вызываются? - PullRequest
2 голосов
/ 12 мая 2009

Допустим, у вас есть какой-то сторонний класс library , который вы хотите расширить, просто добавив в него вспомогательные методы (например, вы можете вызвать унаследованный метод с параметрами по умолчанию).

Используя jUnit / jMock, возможно ли написать утверждение / ложное исключение, которое проверяет, что вызывается правильный унаследованный метод?

Например, что-то вроде этого:

class SomeClass extends SomeLibraryClass {
    public String method(String code) {
         return method(code, null, Locale.default());
    }
}

Как я могу утверждать, что method вызывается?

Ответы [ 4 ]

4 голосов
/ 12 мая 2009

Вы можете создать дополнительный подкласс внутри своего модульного теста, который фактически скажет вам:

public class MyTest {
    boolean methodCalled = false;

    @Test
    public void testMySubclass(){
          TestSomeClass testSomeClass = new TestSomeClass();
          // Invoke method on testSomeclass ...
          assertTrue( methodCalled);

    }  
    class TestSomeClass extends SomeClass{
        public String method(String code){
              methodCalled = true;
        } 
     }
}
2 голосов
/ 12 мая 2009

Модульное тестирование более полезно для проверки функциональности данных методов, а не для подтверждения охвата. Модульные тесты, которые больше заботятся о том, какой метод вызывается, знают о классах, которые они тестируют, больше, чем они, вероятно, должны, не говоря уже о том, что читатель может запутаться.

Инструменты покрытия, такие как Cobertura или EMMA , сообщат вам, правильно ли вы покрыли свой код.

1 голос
/ 17 декабря 2009

Возможно, в этом случае лучше написать интеграционные тесты, но если вам действительно нужен модульный тест, вы можете провести его так же легко, как и в любом другом случае:

public class SomeClassTest
{
    @Test
    public void testMethod()
    {
        final String code = "test";

        new Expectations()
        {
            SomeLibraryClass mock;

            {
                mock.method(code, null, (Locale) any);
            }
        };

        new SomeClass().method(code);
    }
}

В этом тесте используется интерфейс JMockit Mocking API.

0 голосов
/ 05 сентября 2009

Трудно сказать без более конкретного примера, но я бы предположил, что это должен быть интеграционный тест - тестирование всего пакета вместе, а не модульный тест. Иногда при юнит-тестировании можно быть слишком мелким.

...