2016-08-31 6 views
3

Использования JUnit для тестированияJMockit издеваться не получает уничтожены

классов:

Есть класс TestAccess.java, имеющего

static private TestAccess instance = new TestAccess(); 
public static TestAccess getTestAccess() { 
    returns instance; 
} 

Для тестирования тестового класса A.java используется JMockit для имитации getTestAccess методы

@Mock 
TestAccess mockTestaccess;  

@Test 
public void testMethod() { 
    new MockUp<TestAccess>() { 
     @mockit.Mock 
     public TestAccess getTestAccess() { 
      return mockTestaccess; 
     } 
    }; 

    TestAccess test=TestAccess.getTestAccess(); 
} 

В другом классе B.java Я не хочу использовать moker и звоню TestAccess.java следующим

@Test 
public void doTest() 
{ 
    TestAccess test=TestAccess.getTestAccess(); 
} 

B.java если работать независимо друг от друга, реальный TestAccess экземпляр возвращается и работает отлично.

Однако во время мавена запустить его не удается, так как даже в B.java в TestAccess.getTestAccess() возвращение Ложная определяется в A.java, а не реальный случай, как и ожидалось.

Может ли кто-нибудь указать, как это можно решить.

ответ

1

Пробовал

MockUp<TestAccess> mockTestAccess=new MockUp<TestAccess>() { 

    @Mock 
    public TestAccess getTestAccess() { 
     return mockTestaccess; 
    } 
}; 

затем в aftermethod имеют mockTestAccess.tearDown()

В настоящее время она работает отлично.

+2

Согласно разработчику JMockit, это почти всегда признак неправильного использования, если вам нужно явно вызывать 'tearDown()'. Это никогда не понадобится. Макет автоматически возвращается при выходе из области, в которой определяется 'MockUp'. Но вы указали слишком мало информации о своем коде, чтобы увидеть полученную вами ошибку. – Vampire

+0

Добавили некоторые подробности. Попробуем поделиться более подробной информацией, если этого недостаточно. – Rameez

1

Ваш пример не будет запущен, так как аннотация @Mock в поле mockTestaccess недействительна. Думаю, это должно быть @Mocked? И если это так, нет необходимости дополнительно использовать new MockUp(), так как @Mocked на mockTestaccess уже будет отмахиваться от всех экземпляров TestAccess во время тестов этого тестового класса, а затем будет автоматически возвращен. Если у вас проблема, то getTestAccess() возвращает некоторый подкласс TestAccess, который тогда не является издеваемым экземпляром, который, возможно, захочет взглянуть на @Capturing, который также изнашивает экземпляры подклассов.

+0

Я использую Junit для модульного тестирования. Используйте @mock (org.mockito.Mock), чтобы издеваться над экземпляром. Так как я хотел издеваться над статическим методом, поэтому использовал jMockito (mockit.MockUp). Только что отредактировал вышеупомянутое заявление, чтобы включить mockit.MockUp, который я пропустил. Также выполняются тестовые примеры. – Rameez

+0

Вы смешиваете два разных насмешливых фреймворка? Почему так? Я бы рекомендовал не смешивать фальшивые фреймворки, а использовать JMockit. – Vampire