2013-04-16 3 views
0

Это мой первый пост в Stackoverflow, до сих пор я был активным читателем этого форума, и я публикую свой первый вопрос здесь.Метод EasyMock mocked method возвращает null при вызове во второй раз после сброса mock-объекта

Это касается использования EasyMock, я новый пользователь EasyMock и в следующем примере кода. Я устанавливаю ожидание для метода соавтора с тем же возвращаемым объектом (неважно, является ли он одним и тем же объектом или другой объект, но результат тот же), и я сбрасываю его до выхода из метода тестирования. но когда выполняется второй тест, издевательский метод возвращает null, я не уверен, почему это происходит.

Если я бегу методы

@RunWith(PowerMockRunner.class) 
@PrepareForTest({CollaboratorWithMethod.class, ClassTobeTested.class}) 
public class TestClassTobeTested { 

private TestId testId = new TestId(); 

@Test 
public void testMethodtoBeTested() throws Exception{ 
    CollaboratorWithMethod mockCollaborator = EasyMock.createMock(CollaboratorWithMethod.class); 
    PowerMock.expectNew(CollaboratorWithMethod.class).andReturn(mockCollaborator); 
    EasyMock.expect(mockCollaborator.testMethod("test")).andReturn(testId); 
    PowerMock.replay(CollaboratorWithMethod.class); 
    EasyMock.replay(mockCollaborator); 
    ClassTobeTested testObj = new ClassTobeTested(); 
    try { 
     testObj.methodToBeTested(); 
    } finally { 
     EasyMock.reset(mockCollaborator); 
     PowerMock.reset(CollaboratorWithMethod.class); 
    } 
} 

@Test 
public void testMothedtoBeTestWithException() throws Exception { 
    CollaboratorWithMethod mockCollaborator = EasyMock.createMock(CollaboratorWithMethod.class); 
    PowerMock.expectNew(CollaboratorWithMethod.class).andReturn(mockCollaborator); 
    EasyMock.expect(mockCollaborator.testMethod("test")).andReturn(testId); 
    PowerMock.replay(CollaboratorWithMethod.class); 
    EasyMock.replay(mockCollaborator); 
    ClassTobeTested testObj = new ClassTobeTested(); 
    try { 
     testObj.methodToBeTested(); 
    } finally { 
     EasyMock.reset(mockCollaborator); 
     PowerMock.reset(CollaboratorWithMethod.class); 
    } 
} 

}

Вот мой класс Collaborator

public class CollaboratorWithMethod { 
    public TestId testMethod(String text) throws IllegalStateException { 
    if (text != null) { 
     return new TestId(); 
    } else { 
     throw new IllegalStateException(); 
    } 
    } 
} 

А вот мой класс тестируемой

public class ClassTobeTested { 

public static final CollaboratorWithMethod collaborator = new CollaboratorWithMethod(); 

public void methodToBeTested() throws IOException{ 
    try { 
     TestId testid = collaborator.testMethod("test"); 
     System.out.println("Testid returned "+ testid); 
    } catch (IllegalStateException e) { 
     throw new IOException(); 
    } 
} 
} 

Ищу за помощью от вас ребята, чтобы понять, что именно здесь происходит

+0

Не уверен, что это связано с тем, что соавтор определен окончательно в ClassTobeTested. –

+0

может быть, но не уверен, как я могу решить проблему в этом случае при модификации ClassTobeTested, поскольку я не хочу трогать свой ClassTobeTested только потому, что я не смог бы протестировать те же – Muthu

+0

, по крайней мере, подтвердить это. –

ответ

0

Переменная collaborator в классе ClassTobeTested является окончательной. Первый тестовый пример инициализирует переменную с помощью макета. Второй тестовый пример не может снова инициализировать переменную. Вы устанавливаете ожидание на макет объекта, созданного во втором тестовом примере, но на самом деле переменная по-прежнему относится к первому издеваемому объекту.

Поскольку вы не хотите изменять класс, вы должны установить ссылку mock один раз с помощью @BeforeClass и сделать «mockCollaborator» глобальной переменной, чтобы вы могли использовать ссылку в нескольких тестовых случаях.

+0

Да, спасибо за объяснение, что решает мою проблему. Но я бы ожидал, что PowerMock сообщит о некоторой ошибке, когда мы снова ожидаем, что это будет подтверждено во втором методе тестирования. Я также попытался использовать WhilteBox.setInternalState, и это сработало, даже если я попытался установить разные объекты для окончательной varibale в разных методах тестирования. В любом случае, большое спасибо за помощь. – Muthu

Смежные вопросы